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);
- 注意:
- 创建一个子对象,给子对象添加两个Test脚本,这样运行时可以得到三个Test脚本,因为父对象也有一个,子对象有两个
- 假如是子对象的子对象有对应脚本也能获取,只要是子对象无论是多少代以后都可以
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的 省略不写了 和上面是一样的套路
- 注意:
- 创建父对象,父对象添加四个Test脚本,这样运行时可以得到五个Test脚本,因为父对象也有四个,子对象有一个
- 假如是父对象的父对象有对应脚本也能获取,只要是父对象无论是多少代以前都可以
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