我正在开发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;
}
在这个项目中,那些其他脚本在任何框架中都需要“速度”的值,而不仅仅是在某些情况下
答案 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;
}