在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。就看到具体的反应被打印出来了。

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

相关推荐
我的offer在哪里10 小时前
示例 Unity 项目结构(Playable Game Template)
unity·游戏引擎
淡海水13 小时前
【节点】[Branch节点]原理解析与实际应用
unity·游戏引擎·shadergraph·图形·branch
在路上看风景13 小时前
4.6 显存和缓存
unity
Zik----16 小时前
简单的Unity漫游场景搭建
unity·游戏引擎
在路上看风景1 天前
4.5 顶点和片元
unity
在路上看风景2 天前
31. Unity 异步加载的底层细节
unity
天人合一peng2 天前
Unity中做表头时像work中整个调整宽窄
unity
小李也疯狂2 天前
Unity 中的立方体贴图(Cubemaps)
unity·游戏引擎·贴图·cubemap
牛掰是怎么形成的2 天前
Unity材质贴图引用陷阱:包体暴涨真相
unity·材质·贴图
呆呆敲代码的小Y2 天前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表