相同的脚本,不同的对象,不同的shuffle结果

时间:2016-05-10 05:09:02

标签: c# unity3d 2d unityscript

我有一个脚本来改变对象的行为。让我们说行为1坐,2跳,3步,4跑。然后有一个附加到对象的脚本来改变对象的行为。例如,洗牌行为是3-1-2-4。当我复制对象时,所有重复的对象都具有相同的shuffle结果,因此所有对象行为都是相同的。我想要的是不同的对象有不同的洗牌结果。我能想到的只是为每个对象制作一个不同的脚本,但这并不高效。

[edit]这是附加到对象

的脚本
SelectedIndex

我想要的是复制学生(带护目镜的学生),以便每个学生的行为以不同的方式洗牌

enter image description here

3 个答案:

答案 0 :(得分:1)

问题在于private System.Random _random = new System.Random();行。

只需在该行前面添加static关键字。

static private System.Random _random = new System.Random();

这解决了这个问题。虽然有时,但来自不同Object实例的随机数是相同的但很少见。要减少不同Object获取相同随机数的概率,为Shuffle(int[] array)函数指定一个类和GameObject,然后从StudentScript类的许多实例调用该函数。

因此,创建一个名为RandomGen的类并创建一个GameObject并将其命名为 RANDOMOBJ 。将RandomGen脚本附加到 RANDOMOBJ GameObject。

不要复制它( RANDOMOBJ )。应该有其中一个。

您的RandomGen脚本:

public class RandomGen : MonoBehaviour
{
    static private System.Random _random = new System.Random();


    public void Shuffle(int[] array)
    {
        int p = array.Length;
        for (int n = p - 1; n > 0; n--)
        {
            int r = _random.Next(0, n);
            int t = array[r];
            array[r] = array[n];
            array[n] = t;
        }
    }
}

您的StudentScript脚本。

public class StudentScript : MonoBehaviour
{
    RandomGen randomGen;

    private Animator animator;
    float sec;
    int[] array = { 1, 2, 3, 4, 5 };
    int m;
    public GameManage gm;
    public Animator pengawasAnim;
    public Animator signAnim;

    void Start()
    {
        animator = GetComponent<Animator>();
        sec = 0f;
        m = 0;
        randomGen = GameObject.Find("RANDOMOBJ").GetComponent<RandomGen>();

        randomGen.Shuffle(array);
        foreach (int value in array)
        {
            Debug.Log(value);
        }
    }

//.... Put your other functions below, except the Shuffle function
}

答案 1 :(得分:0)

使用:

int r = Random.Range(0,n);

或:

int r = _random.Next(0, n);

而不是:

{{1}}
你的Shuffle()方法中的

答案 2 :(得分:-1)

将此方法添加到GameObject并在Start()

中调用它
int[] shuffleArray(int[] OriginalArray)
{
    int[] tempCopy = (int[])OriginalArray.Clone();
    int[] tempCopy2 = (int[])OriginalArray.Clone();
    int[] shuffledArray = new int[OriginalArray.Length];

    for (int n = 0; n < shuffledArray.Length; n++)
    {
        //Asign a random OriginalArray's data to the n data of shuffledArray
        int randomValue = _random.Next(0, tempCopy.Length);
        print("n="+n+" randomValue="+randomValue+ " tempCopy.lenght="+ tempCopy.Length);
        shuffledArray[n] = tempCopy[randomValue];

        //Erase the data extracted and reduce the copy of OriginalArray in one
        if (tempCopy2.Length != 0)
        {
            tempCopy2 = new string[tempCopy2.Length - 1];
            for (int m = 0; m < randomValue; m++) tempCopy2[m] = tempCopy[m];
            for (int m = randomValue; m < tempCopy.Length-1; m++) tempCopy2[m] = tempCopy[m + 1];
        }
        tempCopy = tempCopy2;
    }

    return shuffledArray;
}

此代码返回您提供的数组的随机副本。