Unity 用简单工厂模式创建对象

来源:互联网 发布:淘宝商品采集工具 编辑:程序博客网 时间:2024/06/05 20:39

首先是要求:

  • 实现点击效果。 
    • 用 Plane 或其他物体做地面, tag 为“Finish”
    • 点击地面后,出现一个圆形攻击标记,两秒后自动消失。注意:该攻击标记不能挡住点击。(Primitive Objects / Cylinder)
    • 请使用一个简单工厂创建、管理这些的标记,并自动收回这些标记(注意,这些对象创建后,放在列表内,不必释放)。

写代码的难点在于:

  1. 简单工厂其实是不难的,参考之前的代码可以很快写出
  2. 一个注意的地方在于射线的不遮挡
  3. 还有一个是延时调用的处理

全部代码如下:

<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>
0 0
原创粉丝点击