晋中企业网站建设公司,mu建站工具,php网站开发优势,1688加工厂接单首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务#xff1a;使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】
首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名…首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】
首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名为Monster1-4 都完全解压缩后放进预制体包在场景中删除 准备工作做完后 接下我们做【简单工厂模式】
简单工厂不属于23设计模式中的一项但是23设计模式中抽象工厂的基础
简单工厂最低需要三个类就可以完成加上Main类中调用也就四个
首先需要 【抽象产品类】
其次需要 【具体产品类】
再其次需要【生产工厂类】
最后我们通过Main继承Mono挂载再脚本上调用即可
实现
1.创建脚本【抽象产品类】 using UnityEngine; public abstract class IMonster { public GameObject Monster {get;set;} public abstract void Load(); }
2.【具体产品类】 using UnityEngine; namespace Assets.Scripts.Product{ class MonsterA : IMonster{ public override void Load(){ Monster Resources.LoadGameObject(Prefabs/monster1); if(Monster ! null) Monster GameObject.Instantiate(Monster,new Vector3(0,0,0),Quaternion.identity); } } }
3.【生产工厂类】 using Assets.Scripts.Product; namespace Assets.Scripts.SimpleFactory{ public static class Factory{ public static IMonster GetMonster(string type) { IMonster monster; switch (type) { case monsterA: monster new MonsterA(); break; default: monster null; break; } return monster; } } } 4.【控制挂载类】 using Assets.Scripts.SimpleFactory; using UnityEngine; namespace Assets.Scripts{ public class Main : MonoBehaviour{ public IMonster monster; public string type; private void Start(){ monster Factory.GetMonster(monsterA); monster.Load(); } } }
我们回到unity场景中创建一个空物体改名Obj 重置位置 将Main脚本挂载 运行即可生成 接下来我们创建 多个【具体产品类】 当然也需要在其他类里添加 这就是简单工厂不好的地方 增一类 动三类 运行即可实现 目前【简单工厂模式】已经完成
接下来我们将生成的怪物 按不同路径移动
原理
【通过使小球WayPoint作为引导使怪物进行自动导航】
我们首先在unity场景中创建一个3D小球 改名为 WayPoint 将WayPoint放进预制体包 并在场景中移除 接下来通过预制体 拖拽至场景中放置不同路径 我们放大Plane 接下来创建一个空父物体代表移动路径 改名PathA
将所有WayPoint放进PathA下做子类 接下来创建移动脚本Move 将以下代码放进Move using UnityEngine; public class Move : MonoBehaviour{ public Transform[] arr; public float speed 1f; public int idx 0; void Start(){ Transform path GameObject.Find(PathA).transform; if (path ! null){ arr new Transform[path.childCount]; for (int i 0; i arr.Length; i) arr[i] path.GetChild(i); } else Debug.LogError(查找路径点父物体失败 检查父物体名字); } private void Update(){ Vector3 direction arr[idx].position - transform.position; transform.rotation Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), 0.1f); transform.Translate(Vector3.forward * speed); if (direction.sqrMagnitude 1f){ idx; if (idx arr.Length - 1) idx 0; } } }
将Move挂载到四个怪物预制体上
运行前
运行后