【问题标题】:Mark position of spawnpoints in editor在编辑器中标记生成点的位置
【发布时间】:2021-04-03 20:15:09
【问题描述】:

我正在创建一个数字棋盘游戏,它由多个棋盘组成,玩家在棋盘之间移动棋子。

游戏板的脚本需要一个 2D 位置数组,以便在收到一个游戏棋子时知道将棋子移动到哪里。 目前为了在游戏板上标记位置,我将占位符游戏对象添加到预制件中并将它们命名为“spawnpoint\d”。在Awake() 方法中,我使用Transform.Find() 来搜索这些游戏对象。然后,在我保存他们的位置后,我对他们调用Destroy(),因此他们不会出现在游戏中。

我看到两个问题:

  1. 这适用于所有实例化的游戏板,尽管它们的位置都相同。
  2. 我了解到社区专家强烈反对使用 Transform.Find()

我希望将生成点位置存储在静态数组中,因此所有实例都引用相同的数据。此外,我希望借助视觉帮助轻松修改编辑器中的这些位置。

我尝试序列化静态成员,但那些没有显示在编辑器中以便能够修改。

    [SerializeField]
    public static int TestNumber;

TLDR: 如何在 Unity 编辑器中使静态成员在视觉上可变?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    tl;dr 你不能static 字段未序列化。


    你可以这样做,例如

    [SerializeField] private Transform[] spawnPoints;
    public static Transform[] SpawnPoints;
    
    private void Awake ()
    {
        SpawnPoints = spawnPoints;
    }
    

    一般来说,我建议宁愿使用这样的东西:

    // Simply attach this class to each GameObject that shall be a spawn point 
    // MAKE SURE IT IS ACTIVE AND ENABLED BY DEFAULT
    public class SpawnPoint : MonoBehaviour
    {
        // Each SpawnPoint (un)registers itself here
        private static readonly HasSet<SpawnPoint> _instances = new HashSet<SpawnPoint>();
    
        // For the public return a new HashSet to make sure nobody can modify the 
        // original _instances from the outside
        public static HashSet<SpawnPoint>() Instances => new HashSet<SpawnPoint>(_instancea);
    
        private void Awake()
        {
            // Register yourself to the existing instances
            _instances.Add(this);
    
            // Optional: make sure this object is not destroyed when a new scene is loaded
            DontDestroyOnLoad (gameObject);
    
            // simply hide the entire gameObject
            gameObject.SetActive(false);
        }
    
        private void Destroy ()
        {
            // Unregister yourself from the instances
            _instances.Remove(this);
        }
    }
    

    这边

    • 每个生成点都会自动注册到实例,因此您甚至不需要通过 Inspector 对其进行序列化 -> 您也不会忘记任何

    • 加载新场景时,生成点不会被销毁(如果您使用 DontDestroyOnLoad - 否则它们会被销毁并从实例中自动移除)

    • 你禁用了这些对象(虽然实际上如果它们除了这个脚本之外什么都没有附加的话,那也没关系)

    • 您可以轻松访问所有生成点,而无需使用昂贵的东西,例如 FindFindObjectsOfType,而只需通过属性即可

       var availableSpawnPoints = SpawnPoint.Instances;
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2016-07-05
      相关资源
      最近更新 更多