【发布时间】:2020-01-06 04:09:28
【问题描述】:
我对 Unity 和 C# 完全陌生。我尝试使用我的 OOP 知识来构建一些东西来保存我的游戏的数据和“业务逻辑”。
游戏大纲:一些方块掉下来,可以在下落时移动,最后落到窗格上。
立方体是预制对象,必须对其进行跟踪以计算分数、检测不受欢迎的行为等。
场景是:
- 1 个空游戏对象 = CubeSpanPoint + CubeSpawn 脚本
- 1 个空 GameObject = GameMain + GameMain 脚本(保存游戏设置和业务逻辑)
- 1 个预制立方体 + MoveScript + FallingScript
GameMain.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class GameMain : MonoBehaviour
{
private float CubeSpawnSpeed = 3.0f; //seconds
private int score = 0;
// construtor
public GameMain()
{
}
// getter: is falling allowed for the cube
public bool getFalling(){
return true;
}
// getter cube spawn speed
public float getCubeSpawnSpeed(){
return this.CubeSpawnSpeed;
}
}
FallingScript 必须从 MainGame(getter)、FallingSpeed 和下降权限中获取数据。
CubeFalling.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BoxFalling : MonoBehaviour
{
public GameMain gameMain;
void Start(){
// an attempt to get the instance this way, but fail
// GameMain main = GameObject.Find("GameMain").GetComponent<GameMain>();
}
void Update()
{
// Is still falling allowed?
if (gameMain.getFalling()){
transform.Translate(Vector3.down);
}
}
}
但这会产生错误NullReferenceException: Object reference not set to an instance of an object
BoxFalling.Update ()
也不能通过将 GameMain 游戏对象拉到 CubeFalling 脚本中的 gameMain 插槽到同名的公共变量来使用检查器。
我一直期待的是,我必须将 GameMain scipt 拉到 GameMain 游戏对象,这相当于使用 new GameMain 进行实例化。为了重用这个实例,我必须将 GameObject 拉到下降脚本中的 GameMain 变量中。但这不起作用。
【问题讨论】:
-
如果你想让 GameMain 是单一的并且其他脚本可以直接使用它,你可以谷歌这个“singleton pattern c#”