Unity同一场景中不同组件间的调用

一、同一物体(GameObject)的组件之间进行相互调用

由于是同一物体上的组件,所以不需要用 GameObject.Find() 来寻找物体,直接可以获取需要的组件来调用。

如物体 B06_Ch_04_Avatar 上的组件脚本 scriptB 调用组件 Transform 的变量:

public class scriptB : MonoBehaviour 
{
    public Transform ts;
	void Start () {
        ts = GetComponent<Transform>();
	}

    private void OnGUI()
    {
        if (GUILayout.Button("左旋"))
        {
            ts.SetPositionAndRotation(new Vector3(0, 0, 0), Quaternion.Euler(0, 90, 0));
        }
        if (GUILayout.Button("正面"))
        {
            ts.SetPositionAndRotation(new Vector3(0, 0, 0), Quaternion.Euler(0, 0, 0));
        }
        if (GUILayout.Button("右旋"))
        {
            ts.SetPositionAndRotation(new Vector3(0, 0, 0), Quaternion.Euler(0, -90, 0));
        }
    }
}

 

二、同一场景中,不同物体(GameObject)的组件间相互调用

当组件在不同的物体上时,需要先用 GameObject.Find() 来寻找组件所在的物体,然后才能进行调用。

1、在Unity中常常会用一个物体的脚本,来调用另一个物体的脚本中的某一变量。此时是不同的物体。如物体 A 上有一个脚本 scriptA ,物体B上有一个脚本 scriptB。现在物体B上的脚本 scriptB 要调用物体 A 上的脚本 scriptA 中的一个变量值。其实现方法如下

// A物体上的脚本 scriptA
public class scriptA : MonoBehaviour 
{
    public int a1=100;
}
// B物体上的脚本 scriptB
public class scriptB : MonoBehaviour 
{
    public GameObject obj1;
    public scriptA sc;

	void Start () {
        obj1 = GameObject.Find("A");
        // 尤其注意GetComponent<> 和 GetComponents<>的区别
        // GetComponents<>方括号中的参数是一个数组的形式
        sc = obj1.GetComponent<scriptA>();
        Debug.Log(sc.a1);
	}
}

运行时显示结果如下:

 

2、物体B 上的脚本调用物体 B06_Ch_04_Avatar 的Transform 组件中的变量:

// 物体B上的脚本 scriptB
public class scriptB : MonoBehaviour 
{
    public GameObject obj2;
    public Transform ts;
	void Start () {
        obj2 = GameObject.Find("B06_Ch_04_Avatar");
        ts = obj2.GetComponent<Transform>();
	}

    private void OnGUI()
    {
        if (GUILayout.Button("左旋"))
        {
            ts.SetPositionAndRotation(new Vector3(0, 0, 0), Quaternion.Euler(0, 90, 0));
        }
        if (GUILayout.Button("正面"))
        {
            ts.SetPositionAndRotation(new Vector3(0, 0, 0), Quaternion.Euler(0, 0, 0));
        }
        if (GUILayout.Button("右旋"))
        {
            ts.SetPositionAndRotation(new Vector3(0, 0, 0), Quaternion.Euler(0, -90, 0));
        }
    }
}

运行结果如下:

 

【注意】:

1、GetCompoment <T>() 从当前游戏对象获取组件T,只在当前游戏对象中获取,没有就返回null,不会去子物体中去寻找。

2、GetCompomentInChildren<T>() 先从本对象中找,有就返回,没有就去子物体中找,直到找完为止。

3、GetComponents<T>() 获取本游戏对象的所有T组件,返回一个数组。不会去子物体中找。

4、GetComponentsInChildren<T>()=GetComponentsInChildren<T>(true) 取本游戏对象及子物体的所有组件

5、GetComponentsInChildren<T>(false) 取本游戏对象及子物体的所有组件

MyComponment myCom=gameObject.GetComponent<MyComponment>();
 
MyComponment childCom=gameObject.GetComponentInChildren<MyComponment>();
 
MyComponment[] comS=gameObject.GetComponents<MyComponment>();
 
MyComponment[] comS1=gameObject.GetComponentsInChildren<MyComponment>();
 
MyComponment[] comSTrue=gameObject.GetComponentsInChildren<MyComponment>(true);
 
MyComponment[] comSFalse=gameObject.GetComponentsInChildren<MyComponment>(false);

 


参考资料:

[1]  同一个场景不同物体传值问题 2 回复 1071 查看 打印 上一主题 下一主题

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值