0

在我的 2D 游戏中,我有随机对象,每次运行游戏时都会生成 4 到 5 个克隆。我的问题是我还有一个不同的对象,我想将其生成为 1 个克隆,并将其放置在我游戏中随机对象的最后一个克隆之后。

对象随机化在我的游戏中完美运行,我只需要将它与我希望它独立生成的对象分开,并且在随机对象的最后一个克隆之后。

这是我使用 1 行尝试生成独立对象的代码:(代码取自本教程

 using UnityEngine;
    using System;
    using System.Collections.Generic;       //Allows us to use Lists.
    using Random = UnityEngine.Random;      //Tells Random to use the Unity Engine random number generator.

    namespace Completed

    {

        public class BoardManager : MonoBehaviour
        {

            // Using Serializable allows us to embed a class with sub properties in the inspector.
            [Serializable]
            public class Count
            {
                public int minimum;             //Minimum value for our Count class.
                public int maximum;             //Maximum value for our Count class.


                //Assignment constructor.
                public Count (int min, int max)
                {
                    minimum = min;
                    maximum = max;
                }
            }


            public int columns = 7;                                         //Number of columns in our game board.
            public Count random1Count = new Count (1, 2);                       //Lower and upper limit for our random number of objects
            public Count random2Count = new Count (1, 1);
            public Count random3Count = new Count (1, 1);
            public Count random4Count = new Count (1, 1);

            public GameObject[] randomObject1;                                  //Array of objects prefabs.
            public GameObject[] randomObject2;
            public GameObject[] randomObject3;
            public GameObject[] randomObject4;

            public GameObject obj; // the independent object declaration

            private List <Vector3> gridPositions = new List <Vector3> ();   //A list of possible locations to place objects.


            //Clears our list gridPositions and prepares it to generate a new board.
            void InitialiseList ()
            {
                //Clear our list gridPositions.
                gridPositions.Clear ();

                //Loop through x axis (columns).
                for(int x = 2; x < columns; x++)
                {


                    //At each index add a new Vector3 to our list with the x and y coordinates of that position.
                    gridPositions.Add (new Vector3(x, 0.3f, 0f));

                    Instantiate(obj); // my attempt to instantiate the separate object
                    Debug.Log(obj.transform.position.x); // my attempt to track the position of the separate object
                }

            }


            //RandomPosition returns a random position from our list gridPositions.
            Vector3 RandomPosition ()
            {
                //Declare an integer randomIndex, set it's value to a random number between 0 and the count of items in our List gridPositions.
                int randomIndex = Random.Range (0, gridPositions.Count);

                //Declare a variable of type Vector3 called randomPosition, set it's value to the entry at randomIndex from our List gridPositions.
                Vector3 randomPosition = gridPositions[randomIndex];


                //Remove the entry at randomIndex from the list so that it can't be re-used.
                gridPositions.RemoveAt (randomIndex);


                //Return the randomly selected Vector3 position.
                return randomPosition;

            }


            //LayoutObjectAtRandom accepts an array of game objects to choose from along with a minimum and maximum range for the number of objects to create.
            void LayoutObjectAtRandom (GameObject[] tileArray, int minimum, int maximum)
            {
                //Choose a random number of objects to instantiate within the minimum and maximum limits
                int objectCount = Random.Range (minimum, maximum+1);

                //Instantiate objects until the randomly chosen limit objectCount is reached
                for(int i = 0; i < objectCount; i++)
                {

                    //Choose a position for randomPosition by getting a random position from our list of available Vector3s stored in gridPosition
                    Vector3 randomPosition = RandomPosition();




                    //Choose a random tile from tileArray and assign it to tileChoice
                    GameObject tileChoice = tileArray[Random.Range (0, tileArray.Length)];


                    //Instantiate tileChoice at the position returned by RandomPosition with no change in rotation
                    Instantiate(tileChoice, randomPosition, Quaternion.identity);

                }

            }


            //SetupScene initializes our level and calls the previous functions to lay out the game board
            public void SetupScene (int level)
            {

                //Reset our list of gridpositions.
                InitialiseList ();

                //Instantiate a random number of objects based on minimum and maximum, at randomized positions.
                LayoutObjectAtRandom (randomObject1, random1Count.minimum, random1Count.maximum);
                LayoutObjectAtRandom (randomObject2, random2Count.minimum, random2Count.maximum);
                LayoutObjectAtRandom (randomObject3, random3Count.minimum, random3Count.maximum);
                LayoutObjectAtRandom (randomObject4, random4Count.minimum, random4Count.maximum);


            }
        }
    }
4

1 回答 1

0

当你实例化你的最终游戏对象时,你并没有给它一个位置。据我了解,您希望将其放置在与最后一个随机定位的游戏对象相同的位置,但在 x 轴上偏移。为此,您需要Vector3包含最后一个随机生成的 GameObject 的位置,我将其命名为lastRandomPos. 我假设您知道如何获得此值,如果不发表评论,我会将其包含在我的答案中。然后你可以在实例化你的最终游戏对象时传递位置:

var objPos = lastRandomPos;
objPos.x = objPos.x + <however much you want to offset in x>;
Instantiate(obj, objPos, Quaternion.identity);

编辑:获取最后一个随机对象位置的最简单方法是每次InstantiateLayoutObjectAtRandom. 在类范围内声明它,例如在你的声明下面gridPositions

private List <Vector3> gridPositions = new List <Vector3> ();   //A list of possible locations to place objects.
private Vector3 lastRandomPos;

然后当你Instantiate是一个随机对象时,你可以设置这个变量来跟踪它的产生位置:

Instantiate(tileChoice, randomPosition, Quaternion.identity);
lastRandomPos = randomPosition;
于 2015-05-05T08:23:54.237 回答