通知游戏对象变化的最佳方式? (统一脚本组织/代表团)
Best way to notify game objects of change? (Unity Script Organization / Delegation)
目前我有一款游戏有两种模式,一种是构建模式,一种是游戏模式。
对象在构建模式下的行为与在播放模式下的行为不同。
处理这些对象最简单的方法是什么?我应该使用 Toggle 吗?考虑到我在 OnUpdate 中的内容,我当前的性能设置和代码可读性如何?
这是我的示例,用于检查我制作的 GameController 是处于构建模式还是运行模式。它还会在这些模式开始时获取,并且 运行 通过操纵布尔值对函数进行一次。我正在寻找可以帮助我在优化游戏、代码可读性和代码整体格式时做出更好决策的答案。我知道必须有一种更简单的方法,要么使用侦听器,要么使用事件/触发器。
一次游戏中可能会有大约一百个这样的项目,所以我想确保我不会因为调用太多更新而毁了游戏。现在,虽然我有很多这些项目,但性能并没有真正 运行 下降,但没有理由不优化我的游戏。
public class GameItem: MonoBehaviour
{
//....
private void Update()
{
CheckMode();
}
// Checks Current Mode, And If StartingMode
private void CheckMode()
{
// check to see if starting build mode,
if (!gameController.inPlayMode)
{
if (!startingBuildMode)
{
WhenStartingBuildMode();
startingPlayMode = false;
startingBuildMode = true;
}
WhileInBuildMode();
return;
}
// check to see if starting play mode,
if (!startingPlayMode)
{
startingPlayMode = true;
WhenStartingPlayMode();
startingBuildMode = false;
}
// what to do while in play mode
WhileInPlayMode();
}
}
这将代表我使用的模式(具有能够在编辑器中切换模式的额外功能,不确定您是否需要它)
public class GameItem: MonoBehaviour
{
[SerializeField] //see it in edior
private bool _isBuildMode;
public bool isBuildMode
{ get { return _isBuildMode;}
set {
// if you want to make sure code only runs when value changes:
// if (_isBuildMode==value) return;
_isBuildMode=value;
// do stuff related to mode change, like
if (isBuildMode) WhenStartingPlayMode();
}
}
void OnValidate()
{
if (Application.isPlaying) isBuildMode=isInBuildMode; // enable editor change
}
private void Update()
{
if (isBuildMode)
{
WhileInBuildMode();
}
else
{
WhileInPlayMode();
}
}
}
如果您想在游戏控制器中放置布尔机制,您可能需要考虑做类似的事情
public System.Action<bool> OnModeChanged;
private bool _isBuildMode;
public bool isBuildMode
{ get { return _isBuildMode;}
set {
_isBuildMode=value;
if (OnModeChanged!=null) OnModeChanged(value);
}
}
然后您可以订阅您的子组件
void Start()
{
var gameController=GetComponentInParent<GameController>();
if (gameController!=null) gameController.OnModeChanged+=(x)=>
{
isBuildMode=x;
};
}
目前我有一款游戏有两种模式,一种是构建模式,一种是游戏模式。
对象在构建模式下的行为与在播放模式下的行为不同。
处理这些对象最简单的方法是什么?我应该使用 Toggle 吗?考虑到我在 OnUpdate 中的内容,我当前的性能设置和代码可读性如何?
这是我的示例,用于检查我制作的 GameController 是处于构建模式还是运行模式。它还会在这些模式开始时获取,并且 运行 通过操纵布尔值对函数进行一次。我正在寻找可以帮助我在优化游戏、代码可读性和代码整体格式时做出更好决策的答案。我知道必须有一种更简单的方法,要么使用侦听器,要么使用事件/触发器。
一次游戏中可能会有大约一百个这样的项目,所以我想确保我不会因为调用太多更新而毁了游戏。现在,虽然我有很多这些项目,但性能并没有真正 运行 下降,但没有理由不优化我的游戏。
public class GameItem: MonoBehaviour
{
//....
private void Update()
{
CheckMode();
}
// Checks Current Mode, And If StartingMode
private void CheckMode()
{
// check to see if starting build mode,
if (!gameController.inPlayMode)
{
if (!startingBuildMode)
{
WhenStartingBuildMode();
startingPlayMode = false;
startingBuildMode = true;
}
WhileInBuildMode();
return;
}
// check to see if starting play mode,
if (!startingPlayMode)
{
startingPlayMode = true;
WhenStartingPlayMode();
startingBuildMode = false;
}
// what to do while in play mode
WhileInPlayMode();
}
}
这将代表我使用的模式(具有能够在编辑器中切换模式的额外功能,不确定您是否需要它)
public class GameItem: MonoBehaviour
{
[SerializeField] //see it in edior
private bool _isBuildMode;
public bool isBuildMode
{ get { return _isBuildMode;}
set {
// if you want to make sure code only runs when value changes:
// if (_isBuildMode==value) return;
_isBuildMode=value;
// do stuff related to mode change, like
if (isBuildMode) WhenStartingPlayMode();
}
}
void OnValidate()
{
if (Application.isPlaying) isBuildMode=isInBuildMode; // enable editor change
}
private void Update()
{
if (isBuildMode)
{
WhileInBuildMode();
}
else
{
WhileInPlayMode();
}
}
}
如果您想在游戏控制器中放置布尔机制,您可能需要考虑做类似的事情
public System.Action<bool> OnModeChanged;
private bool _isBuildMode;
public bool isBuildMode
{ get { return _isBuildMode;}
set {
_isBuildMode=value;
if (OnModeChanged!=null) OnModeChanged(value);
}
}
然后您可以订阅您的子组件
void Start()
{
var gameController=GetComponentInParent<GameController>();
if (gameController!=null) gameController.OnModeChanged+=(x)=>
{
isBuildMode=x;
};
}