【问题标题】:How to Spawn Two Different Objects Randomly in Two Specified Positions in Unity 2D?如何在 Unity 2D 中的两个指定位置随机生成两个不同的对象?
【发布时间】:2015-12-26 20:43:38
【问题描述】:

我正在处理一个 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];
        }
    }       
}

【问题讨论】:

    标签: c# random unity3d positioning instantiation


    【解决方案1】:

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

     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
      }
    

    【讨论】:

    • 非常感谢!!尽管它简单易行,但我从未想过它 xD 我感谢您的大力帮助!
    【解决方案2】:

    一旦找到pos1,您就已经知道pos2pos1 不是的任何东西。

    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 上留下任何内容。

    【讨论】:

    • 非常感谢您的评论!我在这一行得到一个错误: Vector2 pos2 = position.IndexOf(pos1) == 0 ? 1 : 0;
    • 它说方法IndexOf' takes 1'参数没有重载
    • 我的错,我在想List。将positions.IndexOf(pos1) 替换为System.Array.IndexOf(positions, pos1);
    • 非常感谢您的帮助!我很感激!!我尝试了您的解决方案,出现了一些错误,然后我切换到另一个解决方案并且它有效!我会尝试再次考虑您的解决方案! :) 再次感谢您!
    • 没问题,编码愉快!
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多