我有一个所有怪物应该实现的界面。
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();
答案 0 :(得分:3)
大卫说mymonster
需要初始化。但即使这样,你也会遇到麻烦,因为有一个GameObject
包含一堆Monster2
组件。
所以我建议:
GameObject go = new GameObject (GameObjectName);
return go.AddComponent<Monster2>();
现在每个新怪物都有自己的GameObject,因此可以独立移动。