如何将值发送到其他脚本中的函数?
How can I send a value to function which is placed in other script?
我正在尝试发送一个变量(值?)作为参数。该函数在附加在 UIRoot (ngui) 上的其他脚本中。
下面是我的代码。
包含函数的labelTest脚本:
public class labelTest : MonoBehaviour {
private string val = "hi i'm val";
// Use this for initialization
void Start () {
print ("hello");
}
// Update is called once per frame
void Update () {
print ("update");
//changeLabel ();
//changeLabel (val);
print ("come out changeLabel Func");
}
public void changeLabel () {
print("Im going to change LabelText");
GameObject gol = GameObject.Find ("gol");
UILabel s = gol.GetComponent<UILabel> ();
s.text = "hello";
print (s.text);
}
public void changeLabel (string var) {
print("Im going to change LabelText to var");
GameObject gol = GameObject.Find ("gol");
UILabel s = gol.GetComponent<UILabel> ();
s.text = var;
print (s.text);
}
}
CheckTime 脚本,我必须在其中向 LabelTest 函数发送一个值:
using UnityEngine;
using System.Collections;
public class CheckTime : MonoBehaviour {
public delegate void listener( ArrayList touches );
public event listener touchBegin, touchMove, touchEnd;
float touchTime;
void Start () {
print ("checkTime Script Start()");
touchTime = 0;
touchBegin += ( touches ) =>{ Debug.Log( touchTime ); };
touchEnd += ( touches )=>{ Debug.Log( touchTime ); };
touchMove+= ( touches )=>{ Debug.Log( touchTime ); };
}
void Update () {
print ("sssss");
int count = Input.touchCount;
if( count == 0 ) return;
print (count);
bool begin, move, end;
begin = move = end = false;
GameObject gol = GameObject.Find ("gol");
labelTest go = gol.GetComponent<labelTest>();
ArrayList result = new ArrayList();
for( int i = 0 ; i<count ; i++ ){
Touch touch = Input.GetTouch(i);
result.Add( touch ); //보낼 인자에 추가
if(touch.phase==TouchPhase.Began&&touchBegin!=null) {begin = true; touchTime += Time.deltaTime; Debug.Log(touchTime);}
else if(touch.phase==TouchPhase.Moved&&touchMove!=null) { move = true; touchTime += Time.deltaTime; Debug.Log(touchTime);}
else if(touch.phase==TouchPhase.Ended&&touchEnd!=null) { end = true; touchTime=0; Debug.Log(touchTime);}
//here!
print ("im in checkTime script");
string s = touchTime.ToString(); //// touchTime -> float to string
go.changeLabel(s);
// NullReferenceException : Object reference not set to an instance of an object CheckTime.Update()
Debug.Log(touchTime);
}
//포인트중 하나라도 상태를 가졌다면..
if( begin ) touchBegin(result);
if( end ) touchEnd(result);
if( move ) touchMove(result);
}
}
我要做的是将放置在 CheckTime 脚本中的 touchTime(值)作为参数发送到 changeLabel() 函数并显示在标签文本上。
但是,我遇到了 NullReferenceException。我详细检查了脚本。我怎样才能解决这个问题?请让我知道我现在缺少什么。谢谢。
确保您有一个附加到 GameObject gol 的 labelTest 脚本以使您的脚本正常工作,这是您现在将获得 null ref 异常的唯一原因。
除此之外,不要在更新函数中保留这两行:
GameObject gol = GameObject.Find ("gol");
labelTest go = gol.GetComponent<labelTest>();
GameObject.Find 和 GetComponent 都是昂贵的函数。如果可以的话,你在这里做的最好的事情就是
public labelTest go;
在脚本的顶部。然后在检查器中,您可以将标签 gameObject 指定为该参数。
如果您绝对必须在运行时分配它,那么在开始而不是更新中进行分配。
事实上,除非您对 labelTest 有进一步的计划,否则您可以一起摆脱它并使用
public UILabel timeLabel;
在 CheckTime 的顶部并更改
string s = touchTime.ToString(); //// touchTime -> float to string
go.changeLabel(s);
到
timeLabel.text = touchTime.ToString();
您也可以使用单例方法。如果您的项目中只有一个实例,这种方式会更有用。
在您的 MyManager 中 class
public class MyManager : MonoBehaviour
{
public static MyManager instance;
void Awake() {
instance = this;
}
public void MyFunction() {
//funcion code
}
}
然后,当您想从项目中的任何地方调用此函数时,只需调用
MyManager.instance.MyFunction()
我正在尝试发送一个变量(值?)作为参数。该函数在附加在 UIRoot (ngui) 上的其他脚本中。
下面是我的代码。
包含函数的labelTest脚本:
public class labelTest : MonoBehaviour {
private string val = "hi i'm val";
// Use this for initialization
void Start () {
print ("hello");
}
// Update is called once per frame
void Update () {
print ("update");
//changeLabel ();
//changeLabel (val);
print ("come out changeLabel Func");
}
public void changeLabel () {
print("Im going to change LabelText");
GameObject gol = GameObject.Find ("gol");
UILabel s = gol.GetComponent<UILabel> ();
s.text = "hello";
print (s.text);
}
public void changeLabel (string var) {
print("Im going to change LabelText to var");
GameObject gol = GameObject.Find ("gol");
UILabel s = gol.GetComponent<UILabel> ();
s.text = var;
print (s.text);
}
}
CheckTime 脚本,我必须在其中向 LabelTest 函数发送一个值:
using UnityEngine;
using System.Collections;
public class CheckTime : MonoBehaviour {
public delegate void listener( ArrayList touches );
public event listener touchBegin, touchMove, touchEnd;
float touchTime;
void Start () {
print ("checkTime Script Start()");
touchTime = 0;
touchBegin += ( touches ) =>{ Debug.Log( touchTime ); };
touchEnd += ( touches )=>{ Debug.Log( touchTime ); };
touchMove+= ( touches )=>{ Debug.Log( touchTime ); };
}
void Update () {
print ("sssss");
int count = Input.touchCount;
if( count == 0 ) return;
print (count);
bool begin, move, end;
begin = move = end = false;
GameObject gol = GameObject.Find ("gol");
labelTest go = gol.GetComponent<labelTest>();
ArrayList result = new ArrayList();
for( int i = 0 ; i<count ; i++ ){
Touch touch = Input.GetTouch(i);
result.Add( touch ); //보낼 인자에 추가
if(touch.phase==TouchPhase.Began&&touchBegin!=null) {begin = true; touchTime += Time.deltaTime; Debug.Log(touchTime);}
else if(touch.phase==TouchPhase.Moved&&touchMove!=null) { move = true; touchTime += Time.deltaTime; Debug.Log(touchTime);}
else if(touch.phase==TouchPhase.Ended&&touchEnd!=null) { end = true; touchTime=0; Debug.Log(touchTime);}
//here!
print ("im in checkTime script");
string s = touchTime.ToString(); //// touchTime -> float to string
go.changeLabel(s);
// NullReferenceException : Object reference not set to an instance of an object CheckTime.Update()
Debug.Log(touchTime);
}
//포인트중 하나라도 상태를 가졌다면..
if( begin ) touchBegin(result);
if( end ) touchEnd(result);
if( move ) touchMove(result);
}
}
我要做的是将放置在 CheckTime 脚本中的 touchTime(值)作为参数发送到 changeLabel() 函数并显示在标签文本上。
但是,我遇到了 NullReferenceException。我详细检查了脚本。我怎样才能解决这个问题?请让我知道我现在缺少什么。谢谢。
确保您有一个附加到 GameObject gol 的 labelTest 脚本以使您的脚本正常工作,这是您现在将获得 null ref 异常的唯一原因。
除此之外,不要在更新函数中保留这两行:
GameObject gol = GameObject.Find ("gol");
labelTest go = gol.GetComponent<labelTest>();
GameObject.Find 和 GetComponent 都是昂贵的函数。如果可以的话,你在这里做的最好的事情就是
public labelTest go;
在脚本的顶部。然后在检查器中,您可以将标签 gameObject 指定为该参数。
如果您绝对必须在运行时分配它,那么在开始而不是更新中进行分配。
事实上,除非您对 labelTest 有进一步的计划,否则您可以一起摆脱它并使用
public UILabel timeLabel;
在 CheckTime 的顶部并更改
string s = touchTime.ToString(); //// touchTime -> float to string
go.changeLabel(s);
到
timeLabel.text = touchTime.ToString();
您也可以使用单例方法。如果您的项目中只有一个实例,这种方式会更有用。
在您的 MyManager 中 class
public class MyManager : MonoBehaviour
{
public static MyManager instance;
void Awake() {
instance = this;
}
public void MyFunction() {
//funcion code
}
}
然后,当您想从项目中的任何地方调用此函数时,只需调用
MyManager.instance.MyFunction()