12.基础属性和组件的获取

12.Unity脚本基础-MonoBehavior中的重要内容-基础属性和组件的获取


12.1 知识点

重要成员

gameObject属性获取脚本依附的GameObject

// 获取脚本依附的GameObject
// 打印gameObject和gameObject的名字
print(this.gameObject);
print(this.gameObject.name);
// 可以省略this
print(gameObject);
print(gameObject.name);

transform属性获取脚本依附的GameObject的位置信息

// 获取脚本依附的GameObject的位置信息
// 得到对象位置信息
print(this.transform.position); // 位置
print(this.transform.eulerAngles); // 角度
print(this.transform.lossyScale); // 缩放大小
// 和获取脚本依附的GameObject同理,也可以省略this
// 可以先获得脚本依附的GameObject在点出transform 这种写法和上面是一样的效果 都是得到依附的对象的位置信息
print(this.gameObject.transform.position); // 位置

enabled属性获取脚本是否激活

// 获取脚本是否激活
// 让自己这个脚本失活
this.enabled = false;
// 获取别的脚本对象 依附的gameobject和 transform位置信息
print("获取别的脚本对象" + otherLesson12_MonoBehavior中的重要内容2.gameObject.name);
print("获取别的脚本对象" + otherLesson12_MonoBehavior中的重要内容2.transform.position);
// 在多创建一个游戏对象也挂载当前脚本,两个对象互相拖拽游戏对象,就能得到对方依附的脚本

重要方法

主要介绍得到依附对象上挂载的其它脚本相关的方法

GetComponent方法得到自己挂载的单个脚本

// 根据脚本名获取
// 获取脚本的方法 如果获取失败 就是没有对应的脚本 会默认返回Null
Lesson12_MonoBehavior中的重要内容Test test1 = this.GetComponent("Lesson12_MonoBehavior中的重要内容Test") as Lesson12_MonoBehavior中的重要内容Test;
print("根据脚本名获取"+test1);

// 根据Type获取
Lesson12_MonoBehavior中的重要内容Test test2 = this.GetComponent(typeof(Lesson12_MonoBehavior中的重要内容Test)) as Lesson12_MonoBehavior中的重要内容Test;
print("根据Type获取" + test2);

// 根据泛型获取
// 建议使用泛型获取 因为不用二次转换
Lesson12_MonoBehavior中的重要内容Test test3 = this.GetComponent<Lesson12_MonoBehavior中的重要内容Test>();
if (test3 != null)
{
    print("根据泛型获取" + test3);
}
  • 注意:只要你能得到场景中别的对象或者对象依附的脚本,那你就可以获取到它的所有信息

GetComponents方法得到自己挂载的多个脚本

// 得到自己挂载的多个脚本
Lesson12_MonoBehavior中的重要内容[] lesson12Array = this.GetComponents<Lesson12_MonoBehavior中的重要内容>();
print("得到自己挂载的多个脚本lesson12Array" + lesson12Array.Length);
List<Lesson12_MonoBehavior中的重要内容> lesson12List = new List<Lesson12_MonoBehavior中的重要内容>();
this.GetComponents<Lesson12_MonoBehavior中的重要内容>(lesson12List);
print("得到自己挂载的多个脚本lesson12List" + lesson12List.Count);

注意:假如一个对象挂载了多个相同脚本,只获取其中的一个的话是无法确获取的是哪一个的

GetComponentInChildren方法和GetComponentsInChildren方法得到子对象挂载的脚本(默认也会找自己身上是否挂载该脚本)

// 得到子对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) GetComponentInChildren和GetComponentsInChildren方法

// 方法中是有一个参数的
// 如果传false 意思就是 如果子对象失活 是不会去找这个对象上是否有某个脚本的 默认不传也是false  
// 如果传true 即使子对象失活 也会找这个对象上是否有某个脚本的

// 得子对象 挂载脚本 单个
Lesson12_MonoBehavior中的重要内容Test test4 = this.GetComponentInChildren<Lesson12_MonoBehavior中的重要内容Test>(true);
print("得子对象 挂载脚本 单个" + test4);

// 得子对象 挂载脚本 多个
Lesson12_MonoBehavior中的重要内容Test[] sonTestArray = this.GetComponentsInChildren<Lesson12_MonoBehavior中的重要内容Test>(true);
print("得子对象 挂载脚本 多个 sonTestArray" + sonTestArray.Length);

List<Lesson12_MonoBehavior中的重要内容Test> sonTestList = new List<Lesson12_MonoBehavior中的重要内容Test>();
this.GetComponentsInChildren<Lesson12_MonoBehavior中的重要内容Test>(true, sonTestList);
print("得子对象 挂载脚本 多个 sonTestList" + sonTestList.Count);
  • 注意:
  1. 创建一个子对象,给子对象添加两个Test脚本,这样运行时可以得到三个Test脚本,因为父对象也有一个,子对象有两个
  2. 假如是子对象的子对象有对应脚本也能获取,只要是子对象无论是多少代以后都可以

GetComponentInParent和GetComponentsInParent方法得到父对象挂载的脚本(默认会找自己身上是否挂载该脚本)

// 得到父对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) GetComponentInParent和GetComponentsInParent方法

// 方法中没有参数的 因为假如父对象失活 子对象肯定失活 不不需要检测父对象是否失活
Lesson12_MonoBehavior中的重要内容Test test5 = this.GetComponentInParent<Lesson12_MonoBehavior中的重要内容Test>();
print("得到父对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) 单个" + test4);

Lesson12_MonoBehavior中的重要内容Test[] dadTestArray = this.GetComponentsInParent<Lesson12_MonoBehavior中的重要内容Test>(true);
print("得到父对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) 多个" + dadTestArray.Length);
// 它也有list的 省略不写了 和上面是一样的套路
  • 注意:
  1. 创建父对象,父对象添加四个Test脚本,这样运行时可以得到五个Test脚本,因为父对象也有四个,子对象有一个
  2. 假如是父对象的父对象有对应脚本也能获取,只要是父对象无论是多少代以前都可以

TryGetComponent方法尝试获取脚本

// 尝试获取脚本 TryGetComponent

// 提供了一个更加安全的 获取单个脚本的方法 如果得到了 会返回true
// 然后在来进行逻辑处理即可
Lesson12_MonoBehavior中的重要内容Test test6;
if (this.TryGetComponent<Lesson12_MonoBehavior中的重要内容Test>(out test6))
{
    // 逻辑处理
}

12.2 知识点代码

Lesson12_MonoBehavior中的重要内容

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

public class Lesson12_MonoBehavior中的重要内容 : MonoBehaviour
{
    #region 知识点一 重要成员
    public Lesson12_MonoBehavior中的重要内容 otherLesson12_MonoBehavior中的重要内容2;
    #endregion
    
    void Start()
    {
        #region 知识点一 重要成员

        //1.获取脚本依附的GameObject
        //打印gameObject和gameObject的名字
        print(this.gameObject);
        print(this.gameObject.name);
        //可以省略this
        print(gameObject);
        print(gameObject.name);

        //2.获取脚本依附的GameObject的位置信息
        //得到对象位置信息
        print(this.transform.position);//位置
        print(this.transform.eulerAngles);//角度
        print(this.transform.lossyScale);//缩放大小
        //和获取脚本依附的GameObject同理,也可以省略this
        //可以先获得脚本依附的GameObject在点出transform 这种写法和上面是一样的效果 都是得到依附的对象的位置信息
        print(this.gameObject.transform.position);//位置

        //3.获取脚本是否激活
        //让自己这个脚本失活
        this.enabled = false;
        //获取别的脚本对象 依附的gameobject和 transform位置信息
        print("获取别的脚本对象" + otherLesson12_MonoBehavior中的重要内容2.gameObject.name);
        print("获取别的脚本对象" + otherLesson12_MonoBehavior中的重要内容2.transform.position);

        #endregion

        #region 知识点二 重要方法

        //得到依附对象上挂载的其它脚本

        //1.得到自己挂载的单个脚本 GetComponent方法

        //根据脚本名获取
        //获取脚本的方法 如果获取失败 就是没有对应的脚本 会默认返回Null
        Lesson12_MonoBehavior中的重要内容Test test1 = this.GetComponent("Lesson12_MonoBehavior中的重要内容Test") as Lesson12_MonoBehavior中的重要内容Test;
        print("根据脚本名获取" + test1);

        //根据Type获取
        Lesson12_MonoBehavior中的重要内容Test test2 = this.GetComponent(typeof(Lesson12_MonoBehavior中的重要内容Test)) as Lesson12_MonoBehavior中的重要内容Test;
        print("根据Type获取" + test2);

        //根据泛型获取
        //建议使用泛型获取 因为不用二次转换
        Lesson12_MonoBehavior中的重要内容Test test3 = this.GetComponent<Lesson12_MonoBehavior中的重要内容Test>();
        if (test3 != null)
        {
            print("根据泛型获取" + test3);
        }

        //注意:只要你能得到场景中别的对象或者对象依附的脚本,那你就可以获取到它的所有信息






        //2.得到自己挂载的多个脚本 GetComponents方法
        Lesson12_MonoBehavior中的重要内容[] lesson12Array = this.GetComponents<Lesson12_MonoBehavior中的重要内容>();
        print("得到自己挂载的多个脚本lesson12Array" + lesson12Array.Length);
        List<Lesson12_MonoBehavior中的重要内容> lesson12List = new List<Lesson12_MonoBehavior中的重要内容>();
        this.GetComponents<Lesson12_MonoBehavior中的重要内容>(lesson12List);
        print("得到自己挂载的多个脚本lesson12List" + lesson12List.Count);

        //注意:假如一个对象挂载了多个相同脚本,只获取其中的一个的话是无法确获取的是哪一个的






        //3.得到子对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) GetComponentInChildren方法和GetComponentsInChildren方法

        //方法中是有一个参数的
        //如果传false 意思就是 如果子对象失活 是不会去找这个对象上是否有某个脚本的 默认不传也是false  
        //如果传true 即使子对象失活 也会找这个对象上是否有某个脚本的

        //得子对象 挂载脚本 单个
        Lesson12_MonoBehavior中的重要内容Test test4 = this.GetComponentInChildren<Lesson12_MonoBehavior中的重要内容Test>(true);
        print("得子对象 挂载脚本 单个" + test4);

        //得子对象 挂载脚本 多个
        Lesson12_MonoBehavior中的重要内容Test[] sonTestArray = this.GetComponentsInChildren<Lesson12_MonoBehavior中的重要内容Test>(true);
        print("得子对象 挂载脚本 多个 sonTestArray" + sonTestArray.Length);

        List<Lesson12_MonoBehavior中的重要内容Test> sonTestList = new List<Lesson12_MonoBehavior中的重要内容Test>();
        this.GetComponentsInChildren<Lesson12_MonoBehavior中的重要内容Test>(true, sonTestList);
        print("得子对象 挂载脚本 多个 sonTestList" + sonTestList.Count);

        //注意:假如是子对象的子对象有对应脚本也能获取,只要是子对象无论是多少代以后都可以






        //4.得到父对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) GetComponentInParent和GetComponentsInParent方法

        //方法中没有参数的 因为假如父对象失活 子对象肯定失活 不不需要检测父对象是否失活
        Lesson12_MonoBehavior中的重要内容Test test5 = this.GetComponentInParent<Lesson12_MonoBehavior中的重要内容Test>();
        print("得到父对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) 单个" + test4);

        Lesson12_MonoBehavior中的重要内容Test[] dadTestArray = this.GetComponentsInParent<Lesson12_MonoBehavior中的重要内容Test>(true);
        print("得到父对象挂载的脚本(它默认也会找自己身上是否挂载该脚本) 多个" + dadTestArray.Length);
        //它也有list的 省略不写了 和上面是一样的套路

        //注意:假如是父对象的父对象有对应脚本也能获取,只要是父对象无论是多少代以前都可以

        //5.尝试获取脚本 TryGetComponent

        //提供了一个更加安全的 获取单个脚本的方法 如果得到了 会返回true
        //然后在来进行逻辑处理即可
        Lesson12_MonoBehavior中的重要内容Test test6;
        if (this.TryGetComponent<Lesson12_MonoBehavior中的重要内容Test>(out test6))
        {
            //逻辑处理
        }

        #endregion
    }
}

Lesson12_MonoBehavior中的重要内容Test

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

public class Lesson12_MonoBehavior中的重要内容Test : MonoBehaviour
{    
    void Start()
    {
            
    }

    void Update()
    {
            
    }
}

12.3 练习题

请说出一个继承了MonoBehavior的脚本中,this、this.gameObject、this.transform分别代表什么?

  • this 代表这个脚本对象。
  • this.gameObject 代表这个脚本对象依附的GameObject游戏对象。
  • this.transform 代表这个脚本对象依附的GameObject游戏对象的位置相关信息。

一个脚本A一个脚本B,他们都挂在一个GameObject上,实现在A中的Start函数中让B脚本失活,请用代码失活

创建对象挂载AB脚本

在A的Start中获得当前对象挂载的B脚本判空后让他失活

void Start()
{
    Lesson12_练习题B b = this.GetComponent<Lesson12_练习题B>();
    if (b != null)
    {
        b.enabled = false;
    }
}

一个脚本A一个脚本B,脚本A挂在A对象上,脚本B挂在B对象上,实现在B脚本的Start函数中将A对象上的A脚本失活

创建AB对象,分别挂载AB脚本

因为是要获得别的对象的脚本,所以设置一个公共的A脚本类型的变量,在B的Start中对A脚本类型的变量判空后让他失活

void Start()
{
    if (a != null)
        a.enabled = false;
}

拖拽A对象,拖拽到B对象Inspector窗口的B脚本的公共的A脚本类型的变量中,就可以获得A对象中的A脚本


12.4 练习题代码

Lesson12_练习题

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

public class Lesson12_练习题 : MonoBehaviour
{    
    void Start()
    {
        #region 练习题一
        //请说出一个继承了MonoBehavior的脚本中
        //this、this.gameObject、this.transform分别代表什么?

        //this 代表这个脚本对象
        //this.gameObject 代表这个脚本对象 依附的GameObject游戏对象
        //this.transform 代表这个脚本对象 依附的GameObject游戏对象的位置相关信息
        #endregion

        #region 练习题二
        //一个脚本A一个脚本B,他们都挂在一个GameObject上,
        //实现在A中的Start函数中让B脚本失去活,请用代码失活
        #endregion

        #region 练习题三
        //一个脚本A一个脚本B,脚本A挂在A对象上,脚本B挂在B对象上
        //实现在B脚本的Start函数中将A对象上的A脚本失活
        #endregion
    }
}

Lesson12_练习题A

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

public class Lesson12_练习题A : MonoBehaviour
{
    void Start()
    {
        Lesson12_练习题B b = this.GetComponent<Lesson12_练习题B>();
        if (b != null)
        {
            b.enabled = false;
        }
    }
}

Lesson12_练习题B

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

public class Lesson12_练习题B : MonoBehaviour
{
    public Lesson12_练习题A a;

    void Start()
    {
        if (a != null)
            a.enabled = false;
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏