我对Unity游戏编程有一些疑问,我对游戏编程很新。
我的一个问题:如何在Untiy中编写“游戏逻辑”?我正在使用Visual Studio与C#,Unity和Blender for Models。我假设我会有类似“主”的方法,我的完整游戏开始,我在哪里加载动画/字符/地图等等,还可以包含逻辑,比如什么时候显示菜单,过场动画,介绍,会发生什么游戏点等等。
但我在教程中看到的是一些.cs脚本,它们控制着一些GameObject的动画。但是,我如何管理完整的游戏逻辑(如上所述)与所有属于完整视频游戏?
我缺少什么?
我认为我将拥有类似数据库/文件的东西,用于保存游戏,配置,高分等...我该如何管理?
谢谢!
答案 0 :(得分:1)
每个Unity脚本只有在附加到游戏对象时才能运行。 没有主要方法,因为它已经由Unity本身处理。
您可以拥有的方法就是创建一个游戏对象GameController,其中包含名为GameController.cs
的脚本
GameController.cs
有Awake,Start,Update等方法
您可以在该课程中创建游戏规则,游戏逻辑等。
附加在Player游戏对象上的其他脚本(如PlayerController.cs
)将访问GameController以获取其得分等内容
在PlayerController.cs
脚本中,您将拥有
GameController gameController = GameObject.findGameObjectWithTag("GameController");
gameController.score++
这只是简单工作流程的一个例子
答案 1 :(得分:0)
你可以制作Do not Destroy GameObject而不是附加你的“主”脚本。
答案 2 :(得分:0)
Unity倾向于使用通过反射方法(通常与单例结合)来控制自身的组件。
private void Awake() {}
private void Start() {}
private void Update() {}
有关更多https://docs.unity3d.com/ScriptReference/MonoBehaviour.html的信息,请参见MonoBehaviour
这并不意味着您不能将Unity用于更传统的自上而下的方法。只有1个脚本附加到1个GameObject上,并且在该主对象上实现了上述方法。然后,您可以使用资源或资产捆绑包动态加载内容
https://docs.unity3d.com/ScriptReference/Resources.html https://docs.unity3d.com/Manual/AssetBundlesIntro.html
使用更传统的方法会使设计和调试更加困难,但从长远来看通常应该更优化。
您还将发现确实需要创建对象,但仍由主脚本以某种形式对其进行控制。
答案 3 :(得分:0)
回答老问题,但如果您需要为游戏放置全局变量或方法,我遇到了一个好主意。
首先创建一个 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();
}
我发现这是一种在游戏对象之间共享方法和变量的优雅方式。