您的位置:首页 > 移动开发 > Unity3D

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: