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


    一、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();
        }
    }
    
    折叠

    运行:
    在这里插入图片描述

    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();
            //通过返回值 得到添加的脚本的信息,来做后续的逻辑处理
    
            //补充:关系得到脚本,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);
        }
    }
    

    运行:
    在这里插入图片描述

  • 相关阅读:
    【WAF绕过】姿势总结(一)
    基础:html5、html、htm、xhtml、dhtml、shtml、shtm、xml、xsl、xslt
    js-promise、async/await
    C++学习笔记(十八)
    ROS机器人实战,对标古月老师HRMRP机器人(一)——机器人总体方案设计
    Redis进军磁盘存储
    初识Qt Quick
    项目部署测试之内网穿透
    FPGA系统性学习笔记连载_Day1数字电路基础篇
    癌症研究科学家涉嫌伪造图片,4篇论文被撤稿,老板全身而退
  • 原文地址:https://www.cnblogs.com/ElecSheep/p/16497700.html