【Unity3D】點擊交互——簡單工廠

實現一個很簡單的點擊小遊戲,學習交互相關的內容,在不實時建立銷燬的狀況下,使用簡單工廠建立、管理、回收、複用標記。ide

遊戲概述:點擊出現標記,兩秒內自動消失函數

 

遊戲展現:學習

 

 

 


1.1實現點擊效果。
  1.1.1用 Plane 或其餘物體作地面, tag 爲「Finish」
    先建立Plane,並選擇tag爲Finish。字體

  1.1.2點擊地面後,出現一個圓形攻擊標記,兩秒後自動消失。注意:該攻擊標記不能擋住點擊。(Primitive Objects / Cylinder)this

    1.點擊對象出現事件,以前設置地板的tag爲Finish,能夠利用tag找到對象,對應編寫事件。spa

 

if (hit.collider.gameObject.tag.Contains ("Finish"))

    2.圓形攻擊標記,按提示建立Cylinder做爲攻擊標記。code

GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);

    3.剛開始不知道不能擋住點擊該如何完成,這一點是在總體實現以後才查到相關資料解決的,加上下面一句代碼,把圓柱形標記設爲不啓用,這樣就不會妨礙在同一地方繼續點擊生成或出現圓柱形標記。orm

cylinder_1.GetComponent<Collider> ().enabled = false; // 不影響再次點擊

    4.整理代碼,以下。對象

        void Update() {
            Vector3 mp = Input.mousePosition;
            cm = Camera.main;
            Ray ray = cm.ScreenPointToRay (mp);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) {
                // 若是點擊到標籤爲Tag的對象
                if (hit.collider.gameObject.tag.Contains ("Finish")) {
                    Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f);
                    
                    GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
                    cylinder_1.GetComponent<Collider> ().enabled = false;
                    cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f);
                    
                }
            }
        }

如今能夠點擊建立圓柱形標記,可是還不會消失。要求須要在兩秒內自動消失,考慮增長一個類專門管理消失。(消失不是destroy,以下面所提示的,對象建立以後,放在列表內,沒必要釋放,由於釋放再重建耗費太多資源。)作到這一步,須要先使用簡單工廠,先放上代碼,後續在下一點再講述。blog

專門管理延時的類:

  1.1.3請使用一個簡單工廠建立、管理這些的標記,並自動收回這些標記(注意,這些對象建立後,放在列表內,沒必要釋放)。
爲適應下面紅色字體要求,修改類名和相關函數名。
用戶僅需申請使用便可 GameObject myFactory.placeAttackMark(Vector3 position)
myFactory爲工廠類,其中的placeAttackMark(Vector3 position)函數爲具體實現。
創建myFactory.cs,創建placeAttackMark函數和對象列表(public List<GameObject> free = new List<GameObject>();),將以前Update裏面的內容放到placeAttackMark中。考慮到須要回收對象(修改位置或者隱藏,讓用戶沒法看到),在建立新的標記時須要判斷對象列表裏還有沒有可用的,有則複用不建立。

 修改以前Update裏面的內容,以下所示:重要代碼後寫有註釋。

        public void placeAttackMark(Vector3 target) {
            cm = Camera.main;
            Ray ray = cm.ScreenPointToRay (target);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) {
                // 若是點擊到標籤爲Tag的對象
                GameObject cylinder_1;
                if (hit.collider.gameObject.tag.Contains ("Finish")) {
                    Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f);
                    if (free.Count == 0) { // 若是未使用的圓柱形標記爲空,則建立
                        cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
                        cylinder_1.GetComponent<Collider> ().enabled = false; // 不影響再次點擊
                        cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f);
                        
                    } else {
                        // 還有標記空閒,複用標記
                        cylinder_1 = free[0];
                        free.RemoveAt(0); // 用了以後移除
                        cylinder_1.transform.position = hit.point + new Vector3(0f,0.8f,0f);
                    }
                    // 兩秒後自動消失
                    waitToRecovery wt = cylinder_1.AddComponent<waitToRecovery>();
                    wt.delay2min (cylinder_1, free);
                }
            }

        }

 

最後,在用戶端直接訪問 myFactory.placeAttackMark(Vector3 position)便可。
在這裏,如以前同樣,在myFactory裏面實現了GetInstance方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Com.mygame;

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);
        }
    }
}
相關文章
相關標籤/搜索