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。就看到具体的反应被打印出来了。
本篇文章提供了元素反应的具体思路,当然具体效果还需要在游戏中进行处理 。希望这篇文章对你有帮助。