不知道标题写的够不够清晰,意思就是,有个脚本,需要使用同一个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() {}
}