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

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

2.编写工厂脚本

cs 复制代码
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接口并实现反应方法。

cs 复制代码
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.编写测试脚本

cs 复制代码
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。就看到具体的反应被打印出来了。

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

相关推荐
avi91113 小时前
[AI相关]Unity的C#代码如何简写
unity·c#·语法糖
TT-Kun10 小时前
设计模式 之 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(C++)
设计模式·简单工厂模式·工厂方法模式
心疼你的一切11 小时前
C# 中关于补位的写法 PadLeft,PadRight 函数
开发语言·unity·c#·游戏引擎·csdn·心疼你的一切
沐沐森的故事14 小时前
Unity for Python —— 强大的 Python 脚本支持提升 Unity 编辑器效率
python·unity·编辑器·pythonrunner·pythonengine
xklcy17 小时前
Unity通过Vosk实现离线语音识别方法
unity·语音识别
程序猿多布2 天前
预定义委托(C# and Unity)
unity·c#
Edision_li2 天前
DeepSeek教unity------Dotween
unity·游戏引擎
zfoo-framework2 天前
Unity中NavMesh的使用 及其 导出给java服务端进行寻路
unity
程序猿多布2 天前
数学函数(C#、Lua 、Unity)
unity·c#·lua