转自
本来是想绕开一个脚本调用其他脚本变量这个事情的,但是不管怎么写最后还是绕回来了,有些功能必须这样才好完成。
小伙伴们大同小异地提供了三种方法,但都是与加载组件有关系,比如这个:
但是我不喜欢,只是调用脚本的变量,还有把变量他妈和他奶奶一起带上,好麻烦……
至少我这个功能不需要这样,除非有其他的顺带功能。
以前我也写过脚本互调变量的代码,只是忘了,所以我想肯定有其他的办法,终于在蛮牛上找到了,其中一个小伙伴是这样写的:
public class PickBadgeA : MonoBehaviour {
public static int testcount;
if (pick)
{
……
testcount = 1;
Debug.Log ("捡起来了!");
}
……………………脚本分割线……………………
public class Addtime : MonoBehaviour {
public int addcount;
void Update ()
{
……
if (check)
{
addcount = PickBadgeA.testcount + PickBadgeB.testcountB+OpenCabinet.testcountC;
}
using UnityEngine;
public class ScriptB : MonoBehaviour {
public void DoSomething() {
Debug.Log("Hi there");
}
}
在ScriptA中如果要访问某个GameObject的ScriptB脚本中的DoSomething函数:
using UnityEngine;
public class ScriptA : MonoBehaviour {
public ScriptB other;
void Update() {
other.DoSomething();
}
}
注意ScriptA有一个ScriptB类型的公共变量,这是一个绝妙的小技巧,如此一来你便可以通过编辑器拖拽任何含有ScriptB这一脚本的GameObject至该变量上(因为是public的,所以暴露于编辑器界面中),Unity会自动识别你需要赋值的不是那个GameObject,而是它所包含的ScriptB脚本。
除此之外,如果你不喜欢这种在编辑器中直接赋值的办法,你可以通过GameObject.Find(“somename”) 来获取GameObject:
GameObject go = GameObject.Find("somegameobjectname");
ScriptB other = (ScriptB) go.GetComponent(typeof(ScriptB));
other.DoSomething();
不过需要注意的是GameObject.Find()的执行效率非常低,所以如果可能的话还是尽可能使用“直接赋值法”吧。