【问题标题】:Game Logic Programming in UnityUnity 中的游戏逻辑编程
【发布时间】:2017-08-15 07:12:24
【问题描述】:

我对使用 Unity 进行游戏编程有一些疑问,而且我对游戏编程非常陌生。

我的一个问题:如何在 Untiy 中编写“游戏逻辑”?我正在将 Visual Studio 与 C#、Unity 和 Blender 一起用于模型。我假设我会有类似“主要”方法的东西,我的完整游戏从哪里开始,我在哪里加载动画/角色/地图等,还可以包括什么时候显示菜单、过场动画、介绍、什么时候会发生什么等逻辑游戏点等。

但我在教程中看到的只是一些控制游戏对象动画的 .cs 脚本。但是我如何管理完整的游戏逻辑(如上所述)以及属于完整视频游戏的所有内容?

我错过了什么?

我假设我会有类似数据库/文件的东西,用于保存保存游戏、配置、高分等...我该如何管理?

谢谢!

【问题讨论】:

  • 看看this tutorial,它将帮助您入门。
  • Unity 的模型与您的预期略有不同 - 没有一个 Main() 方法可供您实现。相反,您可以在任何 MonoBehaviour 类中实现 Awake() 或 Start() 方法。大多数资源管理都是自动完成的——通常您只需将对象放在场景中,然后加载它。我鼓励您查找一些教程(Unity 网站上的 videos 是一个相当不错的介绍 - 查找脚本部分)。
  • 请阅读文档,你会得到很多有用的信息:Creating gameplay + Creating and using scripts。 Unity 使用 component based architecture

标签: c# unity3d blender


【解决方案1】:

每个 Unity 脚本只有在附加到游戏对象时才能运行。 没有 main 方法,因为它已经由 Unity 自己处理。

您可以采用的方法就像创建一个游戏对象 GameController,其脚本名为 GameController.cs

GameController.cs 有 Awake、Start、Update 等方法 您可以在该类中创建您的游戏规则、游戏逻辑等。

附加在 Player 游戏对象上的其他脚本(例如 PlayerController.cs)将访问 GameController 以放置其分数以及其他内容

PlayerController.cs 脚本中,您将拥有

GameController gameController = GameObject.findGameObjectWithTag("GameController");

gameController.score++

这只是简单工作流程的示例

【讨论】:

    【解决方案2】:

    您可以制作 Don't Destroy GameObject 而不是附加您的“主”脚本。

    【讨论】:

      【解决方案3】:

      Unity 更喜欢使用每个使用反射方法(通常与单例结合)来控制自己的组件,例如

      private void Awake() {}
      private void Start() {}
      private void Update() {}
      

      更多信息请参见 MonoBehaviour https://docs.unity3d.com/ScriptReference/MonoBehaviour.html

      这并不意味着您不能将 Unity 用于更传统的自上而下的方法。只有 1 个脚本附加到 1 个游戏对象,并在该主对象上实现了上述方法。然后,您可以使用资源或资产包动态加载内容

      https://docs.unity3d.com/ScriptReference/Resources.html https://docs.unity3d.com/Manual/AssetBundlesIntro.html

      使用更传统的方法可能会使设计和调试变得更加困难,但从长远来看通常应该更优化。

      您还会发现确实需要创建对象,但仍以某种形式由主脚本控制。

      【讨论】:

        【解决方案4】:

        回答老问题,但如果您需要为游戏放置全局变量或方法,我想到了一个好主意。

        首先创建一个 C# 脚本作为资产,但不要将它附加到任何游戏对象。在刚刚创建的脚本中创建这样的类

        sing System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        
        public class CommonWorld 
        {
            public static AppState _instance = null;
        
            public CommonWorld() {
                // Your constructor here if needed one
            }
        
            // this makes this singleton
            public static CommonWorld Instance() {
                if (_instance == null) 
                {
                    _instance = new CommonWorld();
                }
                return _instance;
            }
        }
        

        然后在你的 GameObject 中你可以像这样得到你的 CommonWorld 实例

            public void start() 
            {
                CommonWorld world = CommonWorld.Instance();       
            }
        

        我发现这是一种在游戏对象之间共享方法和变量的优雅方式。

        【讨论】:

          猜你喜欢
          • 2016-02-05
          • 1970-01-01
          • 2012-04-25
          • 2020-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-03
          • 2011-12-13
          相关资源
          最近更新 更多