当前位置: 首页 > article >正文

在Unity中用简单工厂模式模拟原神中的元素反应

1. 第一步创建3个脚本Factory(反应工厂),Reactions(具体反应),FactoryText(测试反应的脚本)

 2.编写工厂脚本

using UnityEngine;

// 定义一个元素反应的接口,所有具体的元素反应类都需要实现这个接口
// 接口写在Factory命名空间外部,方便其他类实现
public interface Ireaction
{
    void react();
};
public class Factory : MonoBehaviour
{
//  单例模式
    public static Factory instance;
    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

// 定义一个 TransportFactory 类,用于根据传入的元素类型获取对应的元素反应类
public class TransportFactory
{
    public static Ireaction GetTransport(string type1, string type2)
    {
        switch (type1.ToLower(), type2.ToLower()) // 将传入的元素类型转换为小写,以便进行不区分大小写的比较
        {
            case ("水", "草"):
            case ("草", "水"):
                return new combustion();
            case ("水", "火"):
            case ("火", "水"):
                return new evaporation();
            case ("水", "冰"):
            case ("冰", "水"):
                return new Freeze();
            case ("火", "冰"):
            case ("冰", "火"):
                return new Melting();
            default:
                Debug.Log("无法反应");
                return null;
        }
    }
}

3.编写具体的反应类 

 不同的反应继承Ireaction接口并实现反应方法。

using UnityEngine;

public class combustion : Ireaction
{
    public void react()
    {
        Debug.Log("燃烧");
    }
}
public class evaporation : Ireaction
{
    public void react()
    {
        Debug.Log("蒸发");
    }
}
public class Freeze : Ireaction
{
    public void react()
    {
        Debug.Log("冻结");
    }
}
public class Melting : Ireaction
{
    public void react()
    {
        Debug.Log("融化");
    }
}

4.编写测试脚本

using UnityEngine;

public class FactoryText : MonoBehaviour
{
    void Update()
    {
       //按下空格
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //通过工厂模式得到具体要执行的反应
            var x = TransportFactory.GetTransport("水", "草");
            //如果反应不为空就执行反应
            if (x != null)
            {
                x.react();
            }
        }
       //按下A
        if (Input.GetKeyDown(KeyCode.A))
        {
            var x = TransportFactory.GetTransport("水", "火");
            if (x != null)
            {
                x.react();
            }
        }
       //按下S
        if (Input.GetKeyDown(KeyCode.S))
        {
            var x = TransportFactory.GetTransport("火", "水");
            if (x != null)
            {
                x.react();
            }
        }
    }
}

5.创建一个空对象并将测试脚本挂到空对象上

6.运行游戏 

然后依次按下空格,A,S。就看到具体的反应被打印出来了。

本篇文章提供了元素反应的具体思路,当然具体效果还需要在游戏中进行处理 。希望这篇文章对你有帮助。


http://www.kler.cn/a/553729.html

相关文章:

  • TypeScript学习:初学
  • hbuilderx 小程序分包_微信小程序关于分包【收藏版】
  • 【Java】Enum类的常用方法、实现接口及其实际应用
  • 小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格
  • DeepSeek与ChatGPT:AI语言模型的全面技术解析与对比
  • Matlab离线安装硬件支持包的方法
  • 68页PDF | 数据安全总体解决方案:从数据管理方法论到落地实践的全方位指南(附下载)
  • LLaVA-CoT: Let Vision Language Models Reason Step-by-Step论文解读
  • 基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)
  • AI赋能传统系统:Spring AI Alibaba如何用大模型重构机票预订系统?
  • SpringBoot启动java.nio.charset.MalformedInputException: Input length = 1报错的解决方案
  • Function.prototype.__proto__==Object.prototype
  • 文心一言,下一代模型开源
  • Android Hal AIDL 简介 (一)
  • 什么是Ajax
  • AI 安全时代:SDL与大模型结合的“王炸组合”——技术落地与实战指南
  • 动静态链接与加载
  • GPT-SoVITS更新V3 win整合包
  • 【云原生】SpringCloud-Spring Boot Starter使用测试
  • CST案例:UAV无人机RCS --- 双站,I求解器,比例缩放