一、GameObject中的成員變數
主要思想:得到該腳本依附的GameObject的相關資訊
現有:

Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
void Start()
{
//1.得到名字
print(this.gameObject.name);
//2.更改名字
this.gameObject.name = "Lesson4的新名字";
print(this.gameObject.name);
//3.得到是否激活
print(this.gameObject.activeSelf);
//4.得到是否開啟了靜態
print(this.gameObject.isStatic);
//5.得到層級(Layer)
print(this.gameObject.layer);
//6.得到標簽(Tag)
print(this.gameObject.tag);
//7.得到transform
//this.transform這種方法是Mono提供的
//this.gameObject.transform是GameObject提供的
//這兩種寫法得到的資訊是完全一樣的
print(this.gameObject.transform.position);
}
}
運行:

二、GameObject中的靜態方法
2-1.創建Unity自帶的幾何體
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
void Start()
{
GameObject.CreatePrimitive(PrimitiveType.Cube);
//補充:
//這個靜態方法是有GameObject型別回傳值的,
//可以用一個GameObject變數去接收它,然后再做后續的邏輯處理
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
//比如改個名字
obj.name = "我用代碼創建的幾何體";
//還能得到這個幾何身上掛載的腳本
//obj.GetComponent...
}
}
運行:

2-2.查找物件相關
無法找到失活的物件
現有:
Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
void Start()
{
//1.查找單個物件
//兩種方法的共同點:
// -無法找到失活的物件
// -如果場景中有多個滿足查找條件的物件,我們無法確定找的是哪一個
// 1-1.通過物件名查找
// 這個查找效率比較低 因為它會在場景中所有物件中進行查找
// 找到了 就回傳對應物件,沒找到 回傳null
GameObject obj2 = GameObject.Find("Wall");
// 保險起見,使用前先判斷是否找到
if (obj2 != null)
{
print("根據名字找的物件:" + obj2.name);
}
else
{
print("沒找到Wall物件");
}
// 1-2.通過Tag查找
GameObject obj3 = GameObject.FindWithTag("Player");
// 或寫成(這兩種寫法是一模一樣的)
//obj3 = GameObject.FindGameObjectWithTag("Player");
// 保險起見,使用前先判斷是否找到
if (obj3 != null)
{
print("根據Tag找的物件:" + obj3.name);
}
else
{
print("沒找到Tag為Player的物件");
}
//學到現在,目前有兩種得到單個物件的方式:
// -先暴露出去,然后從外部面板拖進去 進行關聯
// -通過API去查找
//2.查找多個物件
// 只能通過Tag去查找多個物件
// 將回傳一個GameObject陣列
GameObject[] objs = GameObject.FindGameObjectsWithTag("Player");
print("Tag為Player的物件個數:" + objs.Length);
//補充:還有幾個用的很少的查找方法,都是GameObject的父類Object提供的方法
//引出的額外知識點:Unity里的Object 不是指C#里的萬物之父object
//Unity里的Object是Unity自己寫的,它也屬于萬物之父object
//Unity的Object的命名空間在UnityEngine中;C#的object的命名空間在System中
//此方法可找到場景中掛載了某一個腳本的物件(誰掛了這個腳本 就找誰)
//此方法效率更加底下,因為它不僅要去遍歷物件,還要去遍歷腳本
Lesson4 l4 = GameObject.FindObjectOfType<Lesson4>();
}
}
運行:

2-3.實體化(克隆)、洗掉物件的方法
被克隆的物件:①可以是場景上的物件、②可以是一個預制體
現有:

Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
//準備用來被克隆的物件
public GameObject obj;
//準備用來被洗掉的物件
public GameObject obj2;
void Start()
{
//實體化(克隆)物件
//作用:根據一個GameObject物件創建出一個和它一模一樣的GameObject物件
//將會回傳一個被克隆的物件,使用GameObject型別的變數接收
GameObject insObj = GameObject.Instantiate(obj);
//接收之后,就可以隨意操縱insObj了
//補充:如果繼承了MonoBehaviour 可以不用寫前面的GameObject
//因為這個方法是Unity的Object基類提供的,所以可以直接用
//Instantiate(obj);
//洗掉物件
//1.下一幀就洗掉
GameObject.Destroy(obj2);
//2.延遲一段時間后 再洗掉
//引數1 要洗掉的物件
//引數2 幾秒后洗掉
GameObject.Destroy(obj2, 3);
//3.Destroy不僅可以洗掉物件,還可以洗掉腳本
GameObject.Destroy(this); //把自己這個腳本洗掉
//注意:這個Destroy不會馬上洗掉物件,只是給這個物件加了一個移除標識
// 一般情況下,會在下一幀 把物件洗掉,這么做是為了減少卡頓
//如果有特殊需求 需要馬上洗掉物件(一般很少用)
//GameObject.DestroyImmediate(obj2);
//補充:如果繼承了MonoBehaviour 可以不用寫前面的GameObject
//因為這個方法是Unity的Object基類提供的,所以可以直接用
//Destroy(obj2);
}
}
下一步:

運行:

2-4.GameObject物件過場景不移除
Unity中可以創建多個游戲場景,難免會場景之間來回切換
Unity的機制是,一旦切換到另一個場景,此場景里的物件會被全部移除
如果有的物件不想在切換場景的時候被移除
現有:

Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
void Start()
{
//誰不想切換場景時被移除,就傳入誰
//一般都是傳依附的GameObject物件
//下面這句代碼的意思就是 本腳本依附的物件切換場景不被移除
GameObject.DontDestroyOnLoad(this.gameObject);
//補充:如果繼承了MonoBehaviour 可以不用寫前面的GameObject
//因為這個方法是Unity的Object基類提供的,所以可以直接用
DontDestroyOnLoad(this.gameObject);
}
}
運行并切換場景:
此時Lesson4就不會被自動移除了
三、GameObject中的成員方法
3-1.創建空GameObject物件相關
現有:

Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
void Start()
{
//new一個GameObject就是在創建一個空物體
GameObject obj = new GameObject();
//還創建的同時直接命名
GameObject obj2 = new GameObject("創建的同時直接命名");
//創建的同時直接命名并掛載腳本(想掛幾個都行)
GameObject obj3 = new GameObject("創建的同時直接加腳本", typeof(Lesson3), typeof(Lesson2));
}
}
運行:

3-2.為現有GameObject物件添加腳本
之前說過繼承了Mono的腳本 是不能夠new的
如果我們想動態地給現有物件添加腳本的話,就需要使用GameObject提供的方法
現有:

Lesson3的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
//想要添加腳本的GameObject物件
public GameObject obj;
void Start()
{
//為obj添加腳本 誰想加腳本就用誰 .AddComponent
//這種方法用的少,因為回傳值還要as
Lesson3 les3 = obj.AddComponent(typeof(Lesson3)) as Lesson3;
//一般使用泛型
Lesson2 les2 = obj.AddComponent<Lesson2>();
//通過回傳值 得到添加的腳本的資訊,來做后續的邏輯處理
//補充:關系得到腳本,GameObject里得到腳本的方法 和Mono里得到腳本的方法一模一樣,用誰的都可以
//都是.GetComponent系列
}
}
下一步:

運行:

3-3.標簽比較
現有:

Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
void Start()
{
//方法一:
//判斷這個物件的標簽是否是 Player
//回傳值是bool
if (this.gameObject.CompareTag("Player");
{
print("沒錯,物件的標簽是Player");
}
//這兩種↑↓方法是一模一樣的
//方法二:
if (this.gameObject.tag == "Player")
{
print("沒錯,物件的標簽是Player");
}
}
}
運行:

3-4.設定激活失活
現有:

Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
//想要激活的物件
public GameObject Jihuo;
//想要失活的物件
public GameObject shiHuo;
void Start()
{
//激活
Jihuo.SetActive(true);
//失活
shiHuo.SetActive(false);
}
}
下一步:

運行:

3-5.次要的成員方法(了解即可,不建議使用)
通過廣播或發送訊息,讓自己或別人 執行某些行為方法
現有:

Lesson4的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4 : MonoBehaviour
{
void Start()
{
//通知自己 執行某行為
//它會在自己身上掛載的所有腳本中 去找TestFun函式,并執行所有名為TestFun的函式
this.gameObject.SendMessage("TestFun");
//有引數的 直接傳即可
this.gameObject.SendMessage("TestFun2", 99);
//再補充兩個,不舉例子了
//1.廣播行為 讓自己和自己的子物件去執行
//this.gameObject.BroadcastMessage("函式名");
//2.向父物件和自己發送訊息 并執行
//this.gameObject.SendMessageUpwards("函式名")
}
void TestFun()
{
print("Lesson4的TestFun被執行了");
}
void TestFun2(int i)
{
print("Lesson4的TestFun2被執行了" + i);
}
}
Lesson4_1的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson4_1 : MonoBehaviour
{
void TestFun()
{
print("Lesson4_1的TestFun被執行了");
}
void TestFun2(int i)
{
print("Lesson4_1的TestFun2被執行了" + i);
}
}
運行:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/499881.html
標籤:其他
上一篇:水澤-資訊收集自動化工具安裝
下一篇:「題解」火神之友
