设置通用产卵预制件

seting universal spawn prefab

我们一直在努力解决这个问题,理论上,有一个 public 静态对象来保存要生成的预制件应该可以解决这个问题,但是脚本在static 关键字不存在,但对象仍然获得单独的变量,而当我添加 static 关键字时,脚本的变量消失了。我们做错了什么吗?这是确切的定义:

public static Object prefab;

我也是 Unity 的新手,但会提供一些个人研究/发现。我也讨厌显式地公开一些具有 public 属性的对象,这样你就可以 "stick" 场景中的对象预制件。如果尝试动态构建系统/游戏组件,您可以自行决定添加什么/何时添加。我也喜欢提供 STATIC 的方法,这样您就可以在需要另一个 "thing".

的任何时候使用它

我发现使用 "Resources" 可以让您通过代码加载预制件,而无需将控件拖到场景对象,例如主列表。

在您默认的 "Assets" 文件夹中,创建一个文件夹 "Resources"(不确定是否区分大小写)。不管怎样,我把所有其他的东西都放在那个文件夹下……材料、预制件、精灵、纹理等等……所以现在,在我的 "Prefab" 文件夹中,我可以有一个 [=39] 的预制件=]、"Laser"、"Shield" 等等。

现在,如何将这些片段放入您的 STATIC class。您可以创建一个特殊的方法,您调用该方法仅通过 Unity 的资源 class 加载它们,然后创建将 return 克隆相关项目的函数。这样一来,您就可以不用理会原件,而是根据需要在游戏中使用自己的。

类似...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.Collections;

namespace Assets.Scripts
{
    public static class MyGameObjManager 
    {
        private static bool alreadyLoaded;
        public static GameObject myHero { get; private set; }
        public static GameObject myWeapon {get; private set;}

        public static void LoadObjects()
        {
            if (alreadyLoaded)
                return;

            // Load the resource which is RELATIVE to the "Resources" path...
            myHero = (GameObject)Resources.Load("Prefab/Hero");

            // This OTHER appears to load at a SPECIFIC Path allowing it to go to the root level ASSETS
            myWeapon = (GameObject)Resources.LoadAssetAtPath("Assets/Resources/Prefab/Weapon", typeof(GameObject));

            alreadyLoaded = true;
        }

    }

    public class GameMgr2 : MonoBehaviour
    {
        public static GameObject GetHero()
        {
            MyGameObjManager.LoadObjects();
            return (GameObject)Instantiate(MyGameObjManager.myHero, new Vector3(0, 0, 0), new Quaternion());
        }

        public static GameObject GetWeapon()
        {
            MyGameObjManager.LoadObjects();
            return (GameObject)Instantiate(MyGameObjManager.myWeapon, new Vector3(0, 0, 0), new Quaternion());
        }
    }
}

因此,STATIC class 不能派生自 MonoBehavior,它允许 "Instantiate" 调用创建对象的克隆并 return 它。因此,我创建了一个从 MonoBehavior 派生的 SECONDARY 非静态 class,并放置了调用静态游戏对象管理器的静态方法来获取我需要的预制件。

再一次,我也在学习,但希望这对您的设计考虑有所帮助...至于获取英雄或武器的调用,您显然可以通过传入其 Vector3 坐标来参数化它,或者四元数值,但你可以 运行 用它。

静态与非

根据您的代码并使其成为 STATIC 意味着无论有多少 class 被放置在系统中的任何地方,都意味着单个实例。因此,如果您在屏幕上有 5 个预制件,并尝试将每个预制件放在不同的 "thing" 中,它将被最后分配的任何一个覆盖。将 属性 设为 "public" 将允许您在屏幕上有 5 个预制件,然后分别在每个 drag/drop 不同 "things" 上,每个预制件将保留自己的 "thing"实例。

抱歉,在不知道您要实现什么的情况下,我无法提供更多建议。

非静态应该在 drag/drop 编辑器中有所帮助。但是,静态