Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通知游戏对象更改的最佳方式?(统一脚本组织/授权)_C#_Performance_Unity3d_Readability - Fatal编程技术网

C# 通知游戏对象更改的最佳方式?(统一脚本组织/授权)

C# 通知游戏对象更改的最佳方式?(统一脚本组织/授权),c#,performance,unity3d,readability,C#,Performance,Unity3d,Readability,目前我有一个有两种模式的游戏,一种是构建模式,一种是游戏模式 对象在构建模式下的行为与在播放模式下的行为不同 处理这些对象最简单的方法是什么?我应该使用开关吗?考虑到OnUpdate中的内容,我目前对性能和代码可读性的设置如何 下面是一个例子,我有什么,检查我的游戏控制器是在建设模式或播放模式。它还可以获取这些模式何时启动,并通过操纵bools来运行函数一次。我正在寻找的答案可以帮助我在优化游戏、代码可读性和代码整体格式时做出更好的决策。我知道一定有更简单的方法,无论是使用侦听器还是事件/触发器

目前我有一个有两种模式的游戏,一种是构建模式,一种是游戏模式

对象在构建模式下的行为与在播放模式下的行为不同

处理这些对象最简单的方法是什么?我应该使用开关吗?考虑到OnUpdate中的内容,我目前对性能和代码可读性的设置如何

下面是一个例子,我有什么,检查我的游戏控制器是在建设模式或播放模式。它还可以获取这些模式何时启动,并通过操纵bools来运行函数一次。我正在寻找的答案可以帮助我在优化游戏、代码可读性和代码整体格式时做出更好的决策。我知道一定有更简单的方法,无论是使用侦听器还是事件/触发器

一次游戏中可能有大约一百个这样的项目,所以我想确保我不会因为太多的更新调用而破坏游戏。现在,当我有很多这样的东西时,性能并没有下降,但这并不是不优化我的游戏的理由

   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();
    
    
        }
    }

这将代表我使用的模式(有一个额外的功能,可以在编辑器中切换模式,不确定您是否需要它)

如果您想把GooCalm机制放在GAMEngRealDror中,您可能需要考虑做一些类似于

的事情。
      public System.Action<bool> OnModeChanged;
      private bool _isBuildMode;
      public bool isBuildMode
           { get { return _isBuildMode;}
             set {
                  _isBuildMode=value; 
                  if (OnModeChanged!=null) OnModeChanged(value); 

                 }
           }
公共系统。对模型的操作已更改;
私人建筑模式;
公共布尔isBuildMode
{get{return}isBuildMode;}
设置{
_isBuildMode=值;
如果(OnModeChanged!=null)OnModeChanged(value);
}
}
然后可以订阅子组件

void Start()
{
  var gameController=GetComponentInParent<GameController>();
  if (gameController!=null) gameController.OnModeChanged+=(x)=>
    {
      isBuildMode=x;
    };
}
void Start()
{
var gameController=getComponentParent();
如果(gameController!=null)gameController.onModelChanged+=(x)=>
{
isBuildMode=x;
};
}

更新时,能否为OnUpdate()方法提供一些代码?更新时运行CheckMode()类,该类在WhileInPlayMode()或WhileInBuildMode()期间持续运行。这是一个基类,因此这些函数根据项目执行不同的操作。例如,一个敌人的物体会不断地检查玩家的位置。或者一个箱子会不断更新,无论它是否打开。这比我的要流畅得多,我喜欢它!如果我想添加WhenStartingBuildMode,我会使用:If(!isBuildMode)WhenStartingBuildMode()?此外,由于物品从游戏控制器获得模式,在我的游戏控制器上放置bools是否更好?很难知道你的游戏控制器是什么,但很可能最好在那里放置bools。我展示的代码还有一个很好的特性,就是能够绑定到toggles。我已经编辑了我的答案,添加了关于在何处引发事件的建议。
void Start()
{
  var gameController=GetComponentInParent<GameController>();
  if (gameController!=null) gameController.OnModeChanged+=(x)=>
    {
      isBuildMode=x;
    };
}