Unity API 學習筆記——02

三、遊戲物體

(一)創建遊戲物體

1、GameObject go = new GameObject(“Cube”);
2、根據prefab
根據另外一個遊戲物體
public GameObject prefab;
GameObject.Instantiate(prefab);//可以根據prefab 或者 另外一個遊戲物體克隆
3、創建原始的幾何體
GameObject.CreatePrimitive(PrimitiveType.Plane);
GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);

(二)給遊戲物體通過代碼添加組件(AddComponent)

go.AddComponent();
go.AddComponent();

(三)禁用和啓用遊戲物體

1、禁用遊戲物體
gameObject.SetActive(false);
2、啓用遊戲物體
gameObject.SetActive(true);
3、訪問遊戲物體的激活狀態
(1)gameObject.activeSelf;// 當父物體禁用狀態,自身未禁用時返回true
(2)gameObject.activeInHierarchy;// 當父物體禁用狀態,不管自身是否禁用都返回false

測試代碼:

Debug.Log(go.activeInHierarchy);
go.SetActive(false);
Debug.Log(go.activeInHierarchy);
Debug.Log(go.tag);
(四)GameObject、Component和Object的關係

在這裏插入圖片描述
1、獲取遊戲物體名字
Debug.Log(go.name);//直接獲取遊戲物體名字
Debug.Log(go.GetComponent().name);//獲取Transform組件名字
2、UnityEngine下Object的靜態方法
(1)Destroy:銷燬遊戲物體
Destroy(gameObject); //銷燬這個遊戲對象
Destroy(this);// 從遊戲對象中移除此腳本
Destroy(GetComponent());//從遊戲對象中移除剛體組件
Destroy(gameObject, 5);// 五秒後銷燬此對象
(2)Destroylmmediate:立刻銷燬遊戲物體
(3)DontDestroyOnLoad:跳轉遊戲場景時,此遊戲物體不會被銷燬(設置共享遊戲物體)
DontDestroyOnLoad(transform.gameObject);
(4)FindObjectOfType:根據組件類型查找組件(返回找到的第一個符合類型的第一個組件)

測試代碼:

Light light = FindObjectOfType<Light>();
light.enabled = false;

(5)FindObjectsOfType:根據組件類型查找所有滿足條件的組件(返回一個數組)

測試代碼:

Transform[] ts= FindObjectsOfType<Transform>();//不查找 未激活的遊戲物體
foreach (Transform t in ts)
{
    Debug.Log(t);
}

(6)Instantiate:對象實例化
3、GameObject獨有的靜態方法
(1)CreatePrimitive:使用基本的網格渲染器和適當的碰撞器創建遊戲對象。
(2)Find:根據名稱查找。
(3)FindGameObjectsWithTag:根據標籤進行查找。(查找所有的,返回數組)
(4)FindWithTag:根據標籤進行查找。(查找第一個,返回一個)

測試代碼:

//第一種查找方法:
GameObject go = GameObject.Find("Main Camera");
go.SetActive(false);
//第二種查找方法:
GameObject[] gos= GameObject.FindGameObjectsWithTag("MainCamera");
Gos[0].SetActive(false);
//第三種查找方法:
GameObject go = GameObject.FindGameObjectWithTag("Finish");
go.SetActive(false);

4、遊戲物體間消息的發送和接收
(1)BroadcastMessage:廣播消息。當前遊戲物體以及次物體的子物體都會接收這個消息。
(2)SendMessage:當前遊戲物體接收這個消息,不傳給他的子物體。
(3)SendMessageUpwards:當前遊戲物體以及次物體的父物體都會接收這個消息。

測試代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class API04Message : MonoBehaviour {

    public GameObject target;
    void Start()
    {
     target.BroadcastMessage("Attack", null, SendMessageOptions.DontRequireReceiver);
     target.SendMessage("Attack", null, SendMessageOptions.DontRequireReceiver);
      target.SendMessageUpwards("Attack", null, SendMessageOptions.DontRequireReceiver);
	}
}
//Cube(接收返回信息)
public class Cube : MonoBehaviour {

    void Attack()
    {
        Debug.Log(this.gameObject + "正在進行攻擊");  
    }
}

5、得到組件的各種方法函數
(1)GetComponent:得到當前遊戲物體第一個要查找的附加組件。
(2)GetComponents:得到當前遊戲物體所有的要查找的附加組件。
(3)GetComponentInChildren:得到當前遊戲物體和子物體的第一個要查找的附加組件。
(4)GetComponentsInChildren:得到當前遊戲物體和子物體的所有的要查找的附加組件。
(5)GetComponentInParent:得到當前遊戲物體和父物體的第一個要查找的附加組件。
(6)GetComponentsInParent:得到當前遊戲物體和父物體的所有的要查找的附加組件。

測試代碼:

public class API05GetComponent : MonoBehaviour {
    public GameObject target;
	void Start () {
        Cube cube = target.GetComponent<Cube>();
        Transform t = target.GetComponent<Transform>();
        Debug.Log(cube);
        Debug.Log(t);
        Debug.Log("---------------------------------");
        Cube[] cubes = target.GetComponents<Cube>();
        Debug.Log(cubes.Length);
        Debug.Log("---------------------------------");
        cubes = target.GetComponentsInChildren<Cube>();
        foreach (Cube c in cubes)
        {
            Debug.Log(c);
        }
        Debug.Log("---------------------------------");
        cubes = target.GetComponentsInParent<Cube>();
        foreach (Cube c in cubes)
        {
            Debug.Log(c);
        }
	}
}

6、MonoBehaviour
CancelInvoke:取消對這個單行爲的所有調用。
Invoke:在時間秒內調用方法方法名。
InvokeRepeating:以時間秒爲單位重複調用方法方法名。
isActiveAndEnabled:當前組件是否啓用。
enabled:組件禁用/激活。

測試代碼:

public class API06MonoBehaviour : MonoBehaviour {
    public Cube cube;
	void Start () {
        Debug.Log(this.isActiveAndEnabled);
        Debug.Log(this.enabled);
        enabled = false;
        Debug.Log(name);
        Debug.Log(tag);
        Debug.Log(gameObject);
        Debug.Log(transform);

        print("haha");
        Debug.Log(cube.isActiveAndEnabled);
        Debug.Log(cube.enabled);
        cube.enabled = false;
        Debug.Log(cube.name);
        Debug.Log(cube.tag);
        Debug.Log(cube.gameObject);
        Debug.Log(cube.transform);
	}
}1)Invoke的使用
<1> Invoke(要執行的函數名稱,延遲執行的時間):調用一次。
<2>InvokeRepeating(要執行的函數名稱,延遲執行的時間,重複調用的間隔時間):重複調用。
<3> IsInvoking(函數名稱); 判斷某個函數是否等候調用。
<4> CancelInvoke():取消這個腳本中所有的Invoke調用。
<5> CancelInvoke(“函數名”): 取消某個函數的Invoke調用。
測試代碼:
public class API07Invoke : MonoBehaviour {
	void Start () {
        //Invoke("Attack",3);	
        InvokeRepeating("Attack", 4, 2);
        CancelInvoke("Attack");
	}
    void Update()
    {
        bool res = IsInvoking("Attack");
        print(res);
    }
    void Attack()
    {
        print("攻擊目標");
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章