Unity 用简单工厂模式创建对象
2016-03-27 00:55
387 查看
首先是要求:
实现点击效果。用 Plane 或其他物体做地面, tag 为“Finish”
点击地面后,出现一个圆形攻击标记,两秒后自动消失。注意:该攻击标记不能挡住点击。(Primitive Objects / Cylinder)
请使用一个简单工厂创建、管理这些的标记,并自动收回这些标记(注意,这些对象创建后,放在列表内,不必释放)。
写代码的难点在于:
简单工厂其实是不难的,参考之前的代码可以很快写出一个注意的地方在于射线的不遮挡
还有一个是延时调用的处理
全部代码如下:
using UnityEngine; using System.Collections; using System.Collections.Generic; using Com.mygame; namespace Com.mygame{ public class myFactory : System.Object{ public List<GameObject> objs = new List<GameObject>(); private static myFactory _instance; private Camera cm; public Vector3 uselessposition = new Vector3(0f,-2f,0f); public static myFactory GetInstance(){ if (_instance == null) { _instance = new myFactory (); } return _instance; } public void placeAttackmark(Vector3 target){ cm = Camera.main; Ray ray = cm.ScreenPointToRay (target); RaycastHit hit; if(Physics.Raycast(ray,out hit)){ if (hit.collider.gameObject.tag.Contains ("Finish")) { Vector3 finishposition = hit.point + new Vector3(0f,0.5f,0f); // if (objs.Count == 0) { GameObject sp = GameObject.CreatePrimitive (PrimitiveType.Cylinder); sp.GetComponent<Collider> ().enabled = false; sp.transform.position = hit.point+ new Vector3(0f,0.5f,0f);; // 在这里我给每一个新创建的对象添加控制延时的类,继承与monobehavier waitTime wt = sp.AddComponent<waitTime>(); // 给它添加延时函数,传入List,在延时函数中执行list的添加 wt.delayfunction (sp,objs); } else { GameObject sp = objs [0]; objs.RemoveAt (0); sp.transform.position = hit.point + new Vector3(0f,0.5f,0f); //add a timeclass waitTime wt = sp.AddComponent<waitTime>(); wt.delayfunction (sp,objs); } } } } //delay time public class waitTime : MonoBehaviour { public List<GameObject> objss; public GameObject obj; public void delayfunction(GameObject sp,List<GameObject> objs){ StartCoroutine (Waitanddo(sp)); this.objss = objs; this.obj = sp; } public IEnumerator Waitanddo(GameObject sp){ yield return new WaitForSeconds(2.0f); // this.transform.position = new Vector3 (0f,-2f,0f); objss.Add (obj); } } } } public class basecode : MonoBehaviour { private Camera cm; private GameObject temp; // Use this for initialization void Start () { cm = Camera.main; } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown (0)) { Vector3 mp = Input.mousePosition; myFactory.GetInstance ().placeAttackmark (mp); } } }
相关文章推荐
- ubuntu14.04 LTS 安装 Unity Tweak Tool
- Community Detection (社区发现)算法
- 我的Unity Shader 学习心路历程
- Oculus Rift & Unity 开发配置和注意事项
- 在OSX上开发UNITY本地插件的经验分享
- [Unity官方文档翻译]2D or 3D Projects Unity中2D和3D项目的区别
- [Unity官方文档翻译]Downloading and Installing Unity下载和安装unity教程
- Unity3D热更新<一> 学习Lua
- Unity从HelloWord开始
- Unity中ScrollRect锁定元素详述(二)
- Unity 通过计算定点绘制图形
- Unity 问题汇总
- Unit3D--人机交互入门
- Unity3D学习1——鼠标点击效果显示
- 【Unity】2.2 Unity编辑器中的常用菜单项
- 【Unity】2.1 初识Unity编辑器
- 【Unity】2.0 第2章 Unity编辑器和基本操作
- Unity 随机函数的应用
- Unity中ScrollRect锁定元素详述(一)
- 对于解决新版unity5.x的license error 问题