尝试使用来自不同脚本的函数需要静态更新,但会破坏代码的统一性

时间:2016-01-17 06:06:11

标签: c# function unity3d

我在win.cs

中尝试使用不同脚本上的许多函数

例如。

team.cs

PlayGame();

score.cs

UpdateScore();

我有一些变量设置为静态,但不是全部,因为它不需要(但是?)

我试图把PlayGame();和UpdateScore();在win.cs.这要求我做一个:

 public static void UpdateScore(){}

既然这是静态的,我必须将所有与UpdateScore相关的其他可变数据保持静态,然后代码中断。

有没有更好的方法来做我正在做的事情?

我尝试使用team.PlayGame()作为变量,但这也需要整个静态的东西。

对不起,这有点难以解释。

注意:所有功能都是公开的。

2 个答案:

答案 0 :(得分:0)

您只需使用Component.SendMessage从另一个脚本调用脚本方法即可。

来自win.cs脚本的这样的事情:

team teamScript = GameObject.Find("Object that team script is on that").GetComponent<team>();
teamScript.SendMessage("PlayGame", you parameter);

答案 1 :(得分:0)

如果Win.cs需要在Score.cs上调用UpdateScore,那么你就这样:

public class Win : MonoBehaviour{
    [SerializeField]private Score score = null;

    private void Start(){
        if(this.score == null){
            this.score = this.gameObject.GetComponent<Score>();
        }
    }

    // Then you can use this.score.UpdateScore when needed
}

可以使用事件以相反的方式执行相同的操作。

public class Win:MonoBehaviour{
    public EventHandler<System.EventArg> RaiseUpdateScore;
    protected void OnUpdateScore(EventArg args){
        if(RaiseUpdateScore != null){
           RaiseUpdateScore(this, args);
        }
    }

    public void SomeAction(){
       if(someCondition){
            OnUpdateScore(null);
       }
    }
    void OnDestroy(){ RaiseUpdateScore = null; }
}

然后在Score.cs上

public class Score:MonoBehaviour{
    private Win win = null;
    private void Start(){
       this.win = this.gameObject.GetComponent<Win>();
       this.win.RaiseUpdateScore += HandleUpdateScore; 
    }
    private void HandleUpdateScore(object sender , System.EventArg args){}
    private void OnDestroy(){ 
       if(this.win != null){ 
         this.win.RaiseUpdateScore -= HandleUpdateScore;
       } 
    }
}