-2

我是 Unity 和游戏开发的新手。我想用原语制作一个移动堆栈跳跃游戏。我在屏幕中央有一个播放器。敌人正在从屏幕的左右两侧接近玩家。玩家试图通过跳跃来坐在敌人身上,就像在马里奥游戏中一样。如果敌人从侧面击中玩家,则游戏结束。我用 SpawnMan 创建敌人。有一个敌方游戏对象的预制件。SpawnMan 使用 Instantiate() 方法以特定时间间隔创建它们。我想存储有关敌人是从右侧还是左侧接近的数据。我什至想通过创建枚举类型来存储这些信息。总之,我想要拥有左右类型的敌人对象。

enum EnemyType
{
    Left,
    Right
}

// ...
    
Instantiate(enemyPrefab(EnemyType.Left), spawnPos, enemyPrefab.transform.rotation);
4

4 回答 4

0

正如 Chandradhar 所说,除此之外,您还可以使用 Mathf.Sign(player.position.x-enemy.position.x); 查看敌人是来自玩家的左侧还是右侧。

于 2021-04-01T09:52:25.627 回答
0

您不能真正以这种方式传递它,因为 Instantiate 不会在实例化的预制件的脚本上调用构造函数。或者我猜enemyPrefab 可能是一种返回具有设置脚本值的实际预制对象的方法,但这将是一种有点奇怪的方式来获得你想要的东西。

但大概您只是希望敌人对象拥有有关左/右的信息,在这种情况下,最简单的方法是获取附加的脚本,然后分配左/右属性。所以你会在你的敌人脚本中添加这样的东西(附加到敌人预制件的那个)

public class MyEnemyScript : MonoBehaviour
{
    public EnemyType Type;
    
    ... your enemy code here...
}

然后像这样使用它:

var enemyGameObj = Instantiate(enemyPrefab, spawnPos, enemyPrefab.transform.rotation);
enemyGameObj.GetComponent<MyEnemyScript>().Type = EnemyType.Left;

请注意,这不是一个很好的做法,因为 GetComponent 是一个昂贵的调用,但同样也不是实例化所有这些敌人 - 使用池会更好。

于 2021-04-01T10:13:11.257 回答
0

首先实例化时分配一个游戏对象: GameObjectenemy1 = Instantiate(...) 那么,我们可以使用玩家变换和敌人变换向量来获得方向(+ 值和负值)?

于 2021-04-01T07:41:33.080 回答
0

我假设 left 和 right 的枚举是矫枉过正的,但如果你有一些设计原因,敌人需要根据他们在哪一边有一些特殊的逻辑,你仍然可以以更简单的方式处理它。

在你的MyEnemyScript(), 你有Awake()OnEnable()将被 Unity 自动调用的方法,就像Startand一样Update。在其中一个中(OnEnable如果您使用对象池,则使用),输入如下内容:

public EnemyType type;
private void Awake()
{
    if (transform.position.x > PlayerInfo.playerPosition.x)
        type = EnemyType.right;
    else
        type = EnemyType.left;
}

现在你可以不加思索地照常生成敌人。PlayerInfo 可以是静态类或单例,或者您更喜欢使该信息可用。

然后在您的更新循环中,只有两个逻辑路径(我认为这与您正在做的事情相似)。

private void Update()
{
    if(type = EnemyType.left)
        //do left enemy stuff
    else
        //do right enemy stuff
}
于 2021-04-01T15:06:42.110 回答