Unity脚本调用其他GameObject游戏对象

不知道标题写的够不够清晰,意思就是,有个脚本,需要使用同一个Scene下的其他游戏对象。该怎么做呢?

1 拖拉拽的方法

1.1 脚本定义一个变量

在这里插入图片描述
这个变量,不需要像java那样,需要自己去new,而是回到Unity软件中,去绑定一个对象
ps: 记得脚本要保存一下喔!Ctrl + S,动作很快,你忍一下^^

1.2 Unity绑定到具体对象

回到Unity软件,点击绑定这个脚本的游戏对象(GameObject),Inspector面板将会显示脚本的全局参数。
在这里插入图片描述
而且,还自动把参数拆解了一下,写成Test Obj了,我也不知道这到底有啥优点,笑哭…

anyway,我们再把变量想要绑定的对象,拖到Test Obj后面,就完事了。

这样,脚本里面,就可以直接使用testObj了!

当然了,使用testObj建议加判空,不然万一你忘了到Unity软件去绑定,那就会发生空指针喔!

2 代码中实现

比如,同一个Canvas下,有很多对象。那可以写一个MonoBehavior,继承如下的类:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;



    //UI对象控制脚本的父类,可得到所有子对象
    public class BaseUIController : MonoBehaviour
    {
        private Dictionary<string, GameObject> view = new Dictionary<string, GameObject>();


        //获取所有子对象的引用
        private void load_all_object(GameObject root, string path)
        {
            foreach (Transform tf in root.transform)
            {
                if (this.view.ContainsKey(path + tf.gameObject.name))
                {
                    Debug.LogWarning("Warning object is exist:" + path + tf.gameObject.name + "!");
                    continue;
                }
                this.view.Add(path + tf.gameObject.name, tf.gameObject);
                load_all_object(tf.gameObject, path + tf.gameObject.name + "/");
            }

        }

        public virtual void Awake()
        {
            this.load_all_object(this.gameObject, "");
        }

        //找到子物体
        public GameObject findObjectByPath(string path)
        {
            if (view.ContainsKey(path))
            {
                return view[path];
            }
            else
            {
                Debug.LogError("BaseUIController find this GameObject failed, please check view path is existed !!!");
                return null;
            }
        }


        //Button事件绑定案例
        //this.setBtnClickListener("Container_RightBottom/btnBeginGame", onGameStart);
        public void setBtnClickListener(string view_name, UnityAction onclick)
        {
            Button bt = this.view[view_name].GetComponent<Button>();
            if (bt == null)
            {
                Debug.LogWarning("BaseUIController setBtnClickListener: not Button Component!");
                return;
            }

            bt.onClick.AddListener(onclick);
        }

        //Slider事件绑定案例
        //this.setSliderChangelistener("Container_RightBottom/Slider", onSliderChange);
        public void setSliderChangelistener(string view_name, UnityAction<float> on_value_changle)
        {
            Slider s = this.view[view_name].GetComponent<Slider>();
            if (s == null)
            {
                Debug.LogWarning("BaseUIController setSliderChangelistener: not Slider Component!");
                return;
            }

            s.onValueChanged.AddListener(on_value_changle);
        }
    }


这个类的作用,就是帮你根据节点名称,找到对应的对象。
比如,Canvas下,有2个GameObject。
在这里插入图片描述
则搞个脚本:

public class ES30CameraScene : BaseUIController
{
    private const string TAG = "qymv#ES30CameraScene";
    private GameObject RawImage;
    private GameObject PlayBtn;

    void Start() {
        RawImage = findObjectByPath("Page0/RawImage");
        PlayBtn  = findObjectByPath("Button");
        setBtnClickListener("Button", Click);
    }
    void Click() {}
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newchenxf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值