Unity3d 在Unity中,如何在初始化带有实例化()方法(如带有参数的OOP构造函数)的预置时将值设置为属性?
我是Unity和游戏开发的新手。我想用原语制作一个移动堆栈跳跃游戏。我在屏幕中央有一个播放器。敌人正从屏幕的左右两侧接近玩家。在马里奥游戏中,玩家试图通过跳跃坐在敌人身上。如果敌人从侧面击中玩家,游戏结束。我用一个产卵人制造敌人。有一个预设的敌人游戏对象。SpawnMan使用Instantiate()方法在特定的时间间隔创建它们。我想储存敌人是从右边还是左边接近的数据。我甚至想通过创建枚举类型来存储这些信息。总之,我想让敌人的对象具有左右两种类型。在使用参数调用SpawnMan中的Instantiate()方法时,如何设置此属性(left-defect或right-defect)Unity3d 在Unity中,如何在初始化带有实例化()方法(如带有参数的OOP构造函数)的预置时将值设置为属性?,unity3d,initialization,spawning,prefab,Unity3d,Initialization,Spawning,Prefab,我是Unity和游戏开发的新手。我想用原语制作一个移动堆栈跳跃游戏。我在屏幕中央有一个播放器。敌人正从屏幕的左右两侧接近玩家。在马里奥游戏中,玩家试图通过跳跃坐在敌人身上。如果敌人从侧面击中玩家,游戏结束。我用一个产卵人制造敌人。有一个预设的敌人游戏对象。SpawnMan使用Instantiate()方法在特定的时间间隔创建它们。我想储存敌人是从右边还是左边接近的数据。我甚至想通过创建枚举类型来存储这些信息。总之,我想让敌人的对象具有左右两种类型。在使用参数调用SpawnMan中的Instant
enum EnemyType
{
Left,
Right
}
// ...
Instantiate(enemyPrefab(EnemyType.Left), spawnPos, enemyPrefab.transform.rotation);
首先实例化时分配游戏对象: GameObject enemy1=实例化(…)
然后,我们可以使用玩家变换和敌人变换向量来获得一个方向(+值和负值)正如钱德拉哈尔所说,除此之外,你还可以使用数学符号(player.position.x-敌方.position.x);查看敌人是来自玩家的左侧还是右侧。你不能完全以这种方式传递它,因为实例化不会在实例化的预置脚本上调用构造函数。或者我猜enemyPrefab可能是一个返回带有设置脚本值的实际prefab对象的方法,但这是一种获得所需内容的有点奇怪的方法 但您可能只是希望敌方对象具有关于左/右的信息,在这种情况下,最简单的方法是获取附加的脚本,然后分配左/右属性。所以你会在你的敌人脚本中添加类似的内容(附加到敌人预制场的脚本) 然后像这样使用它:
var enemyGameObj = Instantiate(enemyPrefab, spawnPos, enemyPrefab.transform.rotation);
enemyGameObj.GetComponent<MyEnemyScript>().Type = EnemyType.Left;
var enemyGameObj=实例化(enemyPrefab、spawnPos、enemyPrefab.transform.rotation);
enemyGameObj.GetComponent().Type=EnemyType.Left;
请注意,这并不是一个很好的实践,因为GetComponent是一个昂贵的调用,但也不是实例化所有这些敌人-最好使用池。我假设左和右的枚举是多余的,但是如果你有一些设计上的原因,敌人需要根据他们站在哪一方而有一些特殊的逻辑,你仍然可以用一种更简单的方式来处理 在您的
MyEnemyScript()
中,您有Awake()
和OnEnable()
方法,Unity将自动调用这些方法,就像Start
和Update
一样。在其中一种方法中(如果使用对象池,请使用OnEnable
),使用如下内容:
public EnemyType type;
private void Awake()
{
if (transform.position.x > PlayerInfo.playerPosition.x)
type = EnemyType.right;
else
type = EnemyType.left;
}
现在你可以像平常一样不加思考地繁殖敌人了。PlayerInfo可以是一个静态类,也可以是一个单例类,也可以是您希望提供的信息
然后在更新循环中,只有两条逻辑路径(我假设这与您正在做的事情类似)
public EnemyType type;
private void Awake()
{
if (transform.position.x > PlayerInfo.playerPosition.x)
type = EnemyType.right;
else
type = EnemyType.left;
}
private void Update()
{
if(type = EnemyType.left)
//do left enemy stuff
else
//do right enemy stuff
}