繁体   English   中英

如何在Unity 2D中在两个指定的位置随机生成两个不同的对象?

[英]How to Spawn Two Different Objects Randomly in Two Specified Positions in Unity 2D?

我正在一个2D项目中,我试图使用代码中已指定的两个不同位置实例化两个不同的对象。 每个对象应从两个位置中选择一个随机值。 因此,每次玩家运行游戏时,对象都可以交换位置。 我的问题是,有时两个对象选择相同的确切位置,这是错误的。 以下是游戏中应该起作用的仅有两种可能性:

可能性1: 1

可能性2: 2

这是我正在使用的代码:

using UnityEngine;
using System.Collections;

public class Randomizer : MonoBehaviour
{

    public GameObject[] prefab;
    int prefab_num;
    Vector3[] positions;
    Vector3 pos1;
    Vector3 pos2;

    void Start(){ 
        prefab_num = Random.Range(0,1);
        positions = new Vector3[]{new Vector3 (-5, 0f, 0f), new Vector3 (5, 0f, 0f)};
        pos1 = positions [Random.Range (0, positions.Length)];
        pos2 = positions [Random.Range (0, positions.Length)];
        Instantiate (prefab [0], pos1, Quaternion.identity);
        Instantiate (prefab [1], pos2, Quaternion.identity);

    }

    void Update(){ // Here I am trying to prevent objects from spawning on each other but it didn't work for me
        if (pos1 == positions [0] && pos2 == positions [0]) {
            prefab [prefab_num].transform.position = positions [1];
        } else if (pos1 == positions [1] && pos2 == positions [1]) {
            prefab [prefab_num].transform.position = positions [0];
        }
    }       
}

假设我们首先分配第一个对象的位置,然后分配第二个对象的位置,那么只有一个随机因素:位置本身。 因此,一个随机化就足够了。

 void Start()
 {
      int firstPosIdx = Random.Range(0, 1);

      Vector2 firstPos = positions[firstPosIdx];
      Vector2 secondPos = positions[1 - firstPosIdx];

      // instantiate object 1 at firstPos, object 2 as secondPos
  }

一旦找到pos1 ,您就已经知道pos2不是pos1

public void Start()
{
    int prefab_num = Random.Range(0, 1);
    Vector2 positions = new Vector2[] { new Vector2(-5, 0), new Vector2 (5, 0) };
    Vector2 pos1 = positions[Random.Range(0, positions.Length)];
    Vector2 pos2 = positions.IndexOf(pos1) == 0 ? 1 : 0;

    // Instantiate here
}

其他注意事项。 Vector2z为0的Vector3 ,因此在z为0时可以使用它。每一帧都将调用Update ,但是您所做的只是一次检查。 更好的方法是将“ Start更改为“ Awake ,将“ Update更改为“ Start

这样,您可以获取位置并将其实例化,然后检查以防止在Start重叠,并且在Update上不保留任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM