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

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

相关推荐
魔士于安4 天前
unity 丑陋哥布林 哥布林有humannoid 动画没 带动画
unity·游戏引擎·材质·贴图·模型
小贺儿开发5 天前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
淡海水5 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
小小数媒成员5 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
林川~016 天前
Unity新输入系统使用笔记
unity·input system
小贺儿开发6 天前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
林川~017 天前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
yi碗汤园7 天前
MQTT消息队列遥测传输协议
网络·网络协议·unity
林川~017 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api
sensen_kiss7 天前
CPT306 Coursework 1 个人游戏作业——坦克大战
unity·游戏程序·游戏策划