【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

一、GameObject中的成员变量

主要思想:得到该脚本依附的GameObject的相关信息
现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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);     } } 

运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

二、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...     } } 

运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

2-2.查找对象相关

无法找到失活的对象

现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和APILesson4的代码:

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>();     } } 

运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

2-3.实例化(克隆)、删除对象的方法

被克隆的对象:①可以是场景上的对象、②可以是一个预制体
现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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);     } } 

下一步:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

2-4.GameObject对象过场景不移除

Unity中可以创建多个游戏场景,难免会场景之间来回切换
Unity的机制是,一旦切换到另一个场景,此场景里的对象会被全部移除
如果有的对象不想在切换场景的时候被移除

现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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对象相关

现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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));     } } 

运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

3-2.为现有GameObject对象添加脚本

之前说过继承了Mono的脚本 是不能够new的
如果我们想动态地给现有对象添加脚本的话,就需要使用GameObject提供的方法

现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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系列     } } 

下一步:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

3-3.标签比较

现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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");         }     } } 

运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

3-4.设置激活失活

现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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);     } } 

下一步:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

3-5.次要的成员方法(了解即可,不建议使用)

通过广播或发送消息,让自己或别人 执行某些行为方法
现有:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API
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);     } } 

运行:
【Unity学习笔记】基础游戏单位GameObject中常用的属性和API

发表评论

相关文章