如何在Unity 2D中的两个指定位置随机生成两个不同的物体?
How to Spawn Two Different Objects Randomly in Two Specified Positions in Unity 2D?
我正在处理一个 2D 项目,我正在尝试使用代码中已指定的两个不同位置来实例化两个不同的对象。每个对象应从两个位置中随机取一个值。所以每次玩家运行游戏时,对象都可以交换它们的位置。我的问题是有时这两个对象会选择相同的确切位置,这是错误的。以下是在游戏中唯一可行的两种可能性:
可能性一:
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];
}
}
}
一旦找到 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
}
其他一些注意事项。
Vector2
是一个Vector3
,他的z
是0,所以在z
是0的时候可以用。
Update
每一帧都被调用,但你所做的只是一次性检查。执行此方法的更好方法是将 Start
更改为 Awake
,并将 Update
更改为 Start
。
这样,您可以获得位置并实例化,然后检查以防止 Start
中的重叠并在 Update
上不留任何内容。
假设我们首先分配第一个对象的位置,然后分配第二个对象的位置,那么只有一个随机因素:位置本身。所以一次随机化就够了。
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
}
我正在处理一个 2D 项目,我正在尝试使用代码中已指定的两个不同位置来实例化两个不同的对象。每个对象应从两个位置中随机取一个值。所以每次玩家运行游戏时,对象都可以交换它们的位置。我的问题是有时这两个对象会选择相同的确切位置,这是错误的。以下是在游戏中唯一可行的两种可能性:
可能性一: 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];
}
}
}
一旦找到 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
}
其他一些注意事项。
Vector2
是一个Vector3
,他的z
是0,所以在z
是0的时候可以用。
Update
每一帧都被调用,但你所做的只是一次性检查。执行此方法的更好方法是将 Start
更改为 Awake
,并将 Update
更改为 Start
。
这样,您可以获得位置并实例化,然后检查以防止 Start
中的重叠并在 Update
上不留任何内容。
假设我们首先分配第一个对象的位置,然后分配第二个对象的位置,那么只有一个随机因素:位置本身。所以一次随机化就够了。
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
}