【问题标题】:GameObject[] is less accessible than (prefabs)GameObject[] 比(预制件)更难访问
【发布时间】:2018-06-29 01:30:42
【问题描述】:

这基本上为我的无尽跑步者设置了瓷砖,特别是错误是:

可访问性不一致:字段类型“gameobject”的可访问性不如 tilePrefabs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TileManager : MonoBehaviour {

    private Transform playerTransform;
    private float spawnZ = 0.0f;
    private float tileLength = 39.0f;
    private int amnTileOnScreen = 7;

    public GameObject[] tilePrefabs;
    // ** it is already public here **

    private List<GameObject> activeTiles;
    // Use this for initialization
    public void Start () {
        activeTiles = new List<GameObject> ();

        playerTransform = gameObject.FindGameObjectWithTag("Player").transform;
        for (int i = 0; i <= amnTileOnScreen; i++) {
            SpawnTile ();
        }
    }  

    private void Update () {
        if (playerTransform.position.z > (spawnZ - amnTileOnScreen + 
         tileLength)) {
            SpawnTile ();
            //DisableTile ();
            DestroyTile();
        }
    }

    public void SpawnTile(int prefabIndex = - 1)
    {
        GameObject go;
        go = Instantiate(tilePrefabs[0]) as GameObject;

        // reappears here

        go.transform.SetParent(transform);
        go.transform.position = Vector3.forward*spawnZ;
        spawnZ += tileLength;
        activeTiles.Add (go);
    }

    private void DestroyTile()
    {
        Destroy (transform.GetChild (0));
    }
}

【问题讨论】:

  • 您能否向我们提供确切的错误消息,包括正确的大小写?您的问题指出错误消息使用名称“gameobject”,但您的代码中没有“gameobject”。你的代码也会有问题。您正在将实例化对象添加到您的私有 activeTiles 列表中,但随后销毁该对象而不从 activeTiles 列表中删除该对象。不过,这将是一个运行时问题。在这种情况下,Queue&lt;GameObject&gt; 可能会更好。如果可能的话,肯定会回收你的对象(池)。
  • 由于我们不知道错误是什么,因此很难提供帮助。但是,有几件事让我担心。首先,您为 tilePrfabs 使用一个数组,但为 activeTiles 使用一个列表。有什么理由不统一吗?我建议的另一件事是,与其拥有一组瓷砖预制件,不如为每个预制件设置一个公共变量。这就是我使用基于图块的游戏的方式。当然,如果您有大量的瓷砖,这可能不方便。

标签: c# unity3d monodevelop gameobject


【解决方案1】:

这里是问题所在:

playerTransform = gameObject.FindGameObjectWithTag("Player").transform;

gameObjectGameObject 之间存在差异。注意第二个中大写的“G”。

GameObject 只是一个用于创建游戏对象的类。

gameObject 是一个从 GameObject 创建的变量,在 Unity 的 Component 类中声明为 public GameObjects gameObject。它只是 GameObjects 的一个实例。

当您的TileManager 脚本派生自MonoBehaviour 时,您可以访问gameObject 变量。


FindWithTag 函数在GameObject 类中,也被声明为static,这意味着您不需要 GameObject 的实例来调用它。您必须使用类名直接调用它

替换

gameObject.FindGameObjectWithTag("Player").transform;

GameObject.FindGameObjectWithTag("Player").transform;

【讨论】:

  • 再一次证明骆驼皮很烂。
  • 我喜欢 camelcase,因为它们更容易读取变量(与其他人不同的意见),但是是的,像这样的问题是使用它们的缺点之一。
猜你喜欢
  • 2011-10-11
  • 2012-10-27
  • 1970-01-01
  • 2013-05-15
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多