从另一个脚本获取变量的最佳方法

时间:2015-06-11 17:00:30

标签: c# class unity3d

我正在开发2D游戏,我有很多c#脚本。像Speed这样的变量会影响很多gameObject和脚本。我希望所有这些脚本只从一个脚本中读取Speed变量,并且我使用属性执行此操作并且它运行良好。

但是当我从该脚本更改Speed时,我想要问题,其他脚本检测到此更改并更改自己的Speed变量。目前它不是这样的,因为这些脚本在Speed方法中读取Start()

该变量可能会在所有游戏持续时间内改变五次,所以我不希望每一帧都有变化,就在它发生变化时,有些东西神奇地告诉脚本也会更新价值!

我有一些想法来解决这个问题,但我认为这些并不好:

  • 使用Update()FixedUpdate()方法从该组件获取变量(我认为这很糟糕,因为此代码运行的每一帧)
  • 在该公共脚本中,我创建了一个使用Speed变量的脚本列表,并在Speed更改时,向这些脚本发送消息。
  • 我还有很多其他的想法,我知道这是错的,所以我不写那个。

更新: 这是我的公共类,包含Speed变量:

using UnityEngine;
using System.Collections;

public class Utility : MonoBehaviour {

    public float _Speed = 2f;
    public float Speed
    {
        get{return _Speed;}
        set{_Speed = value;}
    }

    void Start () {
    }


    void Update () {
        //Here I can detect change of this variable and send message to other scripts
    }
}

和其他脚本一样访问该变量(例如):

void Start () {
        float mySpeed = GetComponent<Utility> ().Speed;
}
void Update () {
    // Or here I can read speed every frame like below:
    // mySpeed = GetComponent<Utility> ().Speed;
}

在这个项目中,那些其他脚本在任何框架中都需要“速度”的值,而不仅仅是在某些情况下

1 个答案:

答案 0 :(得分:4)

没有多个速度变量,只有一个,并且每次需要时都要求它

SpeedHolder speedHolder;

public void Update()
{
    transform.position += speedHolder.Speed * Time.deltaTime;
}

如果您真的希望以其他方式完成此操作......您可以使用事件和代理。

public class SpeedHolder
{
    private float _speed;

    public event Action<float> OnSpeedChange;

    public float Speed
    {
        get { return _speed; }
        set { SetSpeed(value); }
    }

    public SetSpeed(float value)
    {
        _speed = value;
        if(OnSpeedChange != null)
            OnSpeedChange(_speed);
    }
}

现在在每个使用speed float变量的脚本的每个start方法中,你需要添加这一行:SpeedHolder.OnSpeedChange += ChangeSpeed;并有一个像这样的方法:

public void ChangeSpeed(value)
{
    speed = value;
}