Unity 用简单工厂模式创建对象
2016-06-22 09:44
555 查看
首先是要求:
实现点击效果。 用 Plane 或其他物体做地面, tag 为“Finish”
点击地面后,出现一个圆形攻击标记,两秒后自动消失。注意:该攻击标记不能挡住点击。(Primitive Objects / Cylinder)
请使用一个简单工厂创建、管理这些的标记,并自动收回这些标记(注意,这些对象创建后,放在列表内,不必释放)。
写代码的难点在于:
简单工厂其实是不难的,参考之前的代码可以很快写出一个注意的地方在于射线的不遮挡
还有一个是延时调用的处理
全部代码如下:
<code class="language-c# hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> UnityEngine; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> System.Collections; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> System.Collections.Generic; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> Com.mygame; namespace Com.mygame{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> myFactory : System.Object{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> List<GameObject> objs = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> List<GameObject>(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> myFactory _instance; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> Camera cm; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Vector3 uselessposition = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Vector3(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f,-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> myFactory <span class="hljs-title" style="box-sizing: border-box;">GetInstance</span>(){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (_instance == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) { _instance = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> myFactory (); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> _instance; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">placeAttackmark</span>(Vector3 target){ cm = Camera.main; Ray ray = cm.ScreenPointToRay (target); RaycastHit hit; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Physics.Raycast(ray,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span> hit)){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (hit.collider.gameObject.tag.Contains (<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Finish"</span>)) { Vector3 finishposition = hit.point + <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Vector3(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (objs.Count == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) { GameObject sp = GameObject.CreatePrimitive (PrimitiveType.Cylinder); sp.GetComponent<Collider> ().enabled = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; sp.transform.position = hit.point+ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Vector3(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f);; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在这里我给每一个新创建的对象添加控制延时的类,继承与monobehavier </span> waitTime wt = sp.AddComponent<waitTime>(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 给它添加延时函数,传入List,在延时函数中执行list的添加</span> wt.delayfunction (sp,objs); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> { GameObject sp = objs [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; objs.RemoveAt (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>); sp.transform.position = hit.point + <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Vector3(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//add a timeclass</span> waitTime wt = sp.AddComponent<waitTime>(); wt.delayfunction (sp,objs); } } } } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//delay time</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> waitTime : MonoBehaviour { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> List<GameObject> objss; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> GameObject obj; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">delayfunction</span>(GameObject sp,List<GameObject> objs){ StartCoroutine (Waitanddo(sp)); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.objss = objs; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.obj = sp; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> IEnumerator <span class="hljs-title" style="box-sizing: border-box;">Waitanddo</span>(GameObject sp){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">yield</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> WaitForSeconds(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.0</span>f); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.transform.position = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Vector3 (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f,-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>f,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>f); objss.Add (obj); } } } } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> basecode : MonoBehaviour { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> Camera cm; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> GameObject temp; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Use this for initialization</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> Start () { cm = Camera.main; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Update is called once per frame</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> Update () { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (Input.GetMouseButtonDown (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)) { Vector3 mp = Input.mousePosition; myFactory.GetInstance ().placeAttackmark (mp); } } }</code>
相关文章推荐
- Unity 粒子海洋效果实现
- Unity.击球游戏
- Unity5的关卡切换
- Unity 激活或关闭选中物体快捷键
- unity克隆抛物线型金币的方法
- Unity-C#中关于时间戳的一些方法
- Unity-读取本地txt
- Unity 3d地形系统自定义画笔
- Unity视角控制和Camera的移动
- Unity+Vuforia开发增强现实(AR)教程——识别图的那些坑
- Unity API
- Unity使用protobuf-net进行二进制序列化与反序列化
- Unity客户端设计系列
- Unity3d 5.x 学习笔记(3)—— 发射预制体子弹(Instantiate),点射,扫射,五连发效果
- unity,将camera设为don't clear在android上会显示不正常
- [Unity 5.2] The imported type `UnityEngine.Advertisements.ShowResult' is defined multiple times
- Unity3d 5.x 学习笔记(2)—— 键盘控制物体移动与转向 (move and rotate)
- Unity-Unity3D与IOS交互开发
- unity3d 平滑看向的脚本
- Unity-读取本地txt