Unity3d 在Unity中,如何在初始化带有实例化()方法(如带有参数的OOP构造函数)的预置时将值设置为属性?

Unity3d 在Unity中,如何在初始化带有实例化()方法(如带有参数的OOP构造函数)的预置时将值设置为属性?,unity3d,initialization,spawning,prefab,Unity3d,Initialization,Spawning,Prefab,我是Unity和游戏开发的新手。我想用原语制作一个移动堆栈跳跃游戏。我在屏幕中央有一个播放器。敌人正从屏幕的左右两侧接近玩家。在马里奥游戏中,玩家试图通过跳跃坐在敌人身上。如果敌人从侧面击中玩家,游戏结束。我用一个产卵人制造敌人。有一个预设的敌人游戏对象。SpawnMan使用Instantiate()方法在特定的时间间隔创建它们。我想储存敌人是从右边还是左边接近的数据。我甚至想通过创建枚举类型来存储这些信息。总之,我想让敌人的对象具有左右两种类型。在使用参数调用SpawnMan中的Instant

我是Unity和游戏开发的新手。我想用原语制作一个移动堆栈跳跃游戏。我在屏幕中央有一个播放器。敌人正从屏幕的左右两侧接近玩家。在马里奥游戏中,玩家试图通过跳跃坐在敌人身上。如果敌人从侧面击中玩家,游戏结束。我用一个产卵人制造敌人。有一个预设的敌人游戏对象。SpawnMan使用Instantiate()方法在特定的时间间隔创建它们。我想储存敌人是从右边还是左边接近的数据。我甚至想通过创建枚举类型来存储这些信息。总之,我想让敌人的对象具有左右两种类型。在使用参数调用SpawnMan中的Instantiate()方法时,如何设置此属性(left-defect或right-defect)

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
}