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();}}//按下Aif (Input.GetKeyDown(KeyCode.A)){var x = TransportFactory.GetTransport("水", "火");if (x != null){x.react();}}//按下Sif (Input.GetKeyDown(KeyCode.S)){var x = TransportFactory.GetTransport("火", "水");if (x != null){x.react();}}}
}
5.创建一个空对象并将测试脚本挂到空对象上
6.运行游戏
然后依次按下空格,A,S。就看到具体的反应被打印出来了。
本篇文章提供了元素反应的具体思路,当然具体效果还需要在游戏中进行处理 。希望这篇文章对你有帮助。