使用addComponent而不是new关键字

时间:2014-03-04 13:57:53

标签: c# unity3d

我有一个所有怪物应该实现的界面。

namespace Assets.Scripts
{
    interface IMonster
    {
        void setSpeed(float s);
        float getSpeed();
        void SetMonsterPosition(Vector2 pos);
        Vector2 GetMonsterPosition();
        void DestroyMonster();
        void MoveMonster();
    }
}

然后我有一个具体的怪物类(我会添加更多):

public class Monster2 : MonoBehaviour, IMonster
{

    public Monster2()
    {
        speed = Random.Range(0.05f, 0.15f);
        monster = (GameObject)Instantiate(Resources.Load("Monster2"));
        float height = Random.Range(0, Screen.height);
        Vector2 MonsterStartingPosition = new Vector2(Screen.width, height);
        MonsterStartingPosition = Camera.main.ScreenToWorldPoint(MonsterStartingPosition);
        monster.transform.position = MonsterStartingPosition;
    }

    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

}

一个可以制造我的怪物的工厂类:

class MonsterFactory : MonoBehaviour
    {

        public static IMonster getMonster()
        {                
            return new Monster2();                
        }
    }

这有效,但我读到我不应该使用new,我应该使用AddComponent。所以我尝试了类似的东西:

class MonsterFactory : MonoBehaviour
    {
        public static GameObject mymonster;            //@first
        public static IMonster getMonster()
        {   
            return mymonster.AddComponent<Monster2>(); //@second                
        }
    }

问题是,现在当我尝试运行游戏时出现错误NullReferenceException: Object reference not set to an instance of an object

IMonster monster = MonsterFactory.getMonster();

1 个答案:

答案 0 :(得分:3)

大卫说mymonster需要初始化。但即使这样,你也会遇到麻烦,因为有一个GameObject包含一堆Monster2组件。

所以我建议:

GameObject go = new GameObject (GameObjectName);
return go.AddComponent<Monster2>();

现在每个新怪物都有自己的GameObject,因此可以独立移动。

相关问题