转自 https://blog.csdn.net/jennyhigh/article/details/80900538
本来是想绕开一个脚本调用其他脚本变量这个事情的,但是不管怎么写最后还是绕回来了,有些功能必须这样才好完成。
小伙伴们大同小异地提供了三种方法,但都是与加载组件有关系,比如这个:
原文地址:https://blog.csdn.net/woerxi/article/details/17621841#commentBox
但是我不喜欢,只是调用脚本的变量,还有把变量他妈和他奶奶一起带上,好麻烦……
至少我这个功能不需要这样,除非有其他的顺带功能。
以前我也写过脚本互调变量的代码,只是忘了,所以我想肯定有其他的办法,终于在蛮牛上找到了,其中一个小伙伴是这样写的:
原来就这么简单,所以最后我的代码是这样的:
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;
//调用上个脚本的静态共有;
}
无意中还找到一个调用函数的,感觉也不错,地址如下:
https://blog.csdn.net/liumou111/article/details/46754051
----------------分割线-----------------
调用其他实例的脚本是一种很常用的需求,在Unity3D中实现起来也有多种方法,假设在ScriptB有一个DoSomething函数,如下所示:
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()的执行效率非常低,所以如果可能的话还是尽可能使用“直接赋值法”吧。