相同的脚本,不同的对象,不同的随机播放结果
Same script, different object, different shuffle result
我有一个脚本可以随机播放一个对象的行为。让我们说行为 1-坐,2-跳,3-走,4-运行。然后有一个附加到对象的脚本来改变对象的行为。例如,打乱后的行为是 3-1-2-4。当我复制对象时,所有复制的对象都具有相同的洗牌结果,因此所有对象的行为都是相同的。我想要的是不同的对象有不同的洗牌结果。我能想到的就是为每个对象制作不同的脚本,但效率不高。
[编辑] 这是附加到对象的脚本
using UnityEngine;
using System.Collections;
public class StudentScript : MonoBehaviour {
private System.Random _random = new System.Random();
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;
Shuffle(array);
foreach (int value in array)
{
Debug.Log(value);
}
}
void Update () {
sec+=Time.deltaTime;
if (sec >= 3f && m<5 && animator.GetInteger ("Behav") == 0) {
StudentBehaviour(array[m]);
}
//Debug.Log ("sec "+sec);
if (animator.GetInteger ("Behav") != 0) {
if (sec >= 5)
animator.SetTrigger ("ToDont");
if (sec >= 10)
animator.SetTrigger ("ToEffect");
}
}
public void StudentBehaviour(int n){
animator.SetInteger ("Behav", n);
sec = 0f;
Debug.Log ("jadi "+n);
}
public void ResetStudentBehaviour(){
if (animator.GetInteger ("Behav") != 0) {
pengawasAnim.SetTrigger("Approach");
if (sec >= 0f && sec <=5f) {
signAnim.SetTrigger ("ToYellow");
animator.SetTrigger ("Told1");
gm.AddScore (5);
}else if (sec >= 5f && sec <=10f) {
signAnim.SetTrigger ("ToOrange");
animator.SetTrigger ("Told2");
animator.ResetTrigger ("ToDont");
gm.AddScore (3);
}else if (sec >= 10f) {
signAnim.SetTrigger ("ToRed");
animator.SetTrigger ("Told3");
animator.ResetTrigger ("ToEffect");
gm.AddScore (1);
}
animator.SetInteger ("Behav", 0);
sec = 0f;
Debug.Log ("reset");
if (m < 5) {
m++;
}
Debug.Log ("m = " + m);
Debug.Log ("sec "+sec);
}else
Debug.Log ("student done <3");
}
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;
}
}
我想要的是复制学生(带护目镜的那个),这样每个学生的行为就会不同
使用:
int r = Random.value*n;
或:
int r = Random.Range(0,n);
而不是:
int r = _random.Next(0, n);
在您的 Shuffle() 方法中
问题出在 private System.Random _random = new System.Random();
行。
只需在该行前面添加 static
关键字。
static private System.Random _random = new System.Random();
这解决了问题。尽管有时,来自不同对象实例的随机数是相同的,但这种情况很少见。为了减少不同对象获得相同随机数的概率,为Shuffle(int[] array)
函数指定一个class和游戏对象,然后从多个实例中调用该函数StudentScript
class。
因此创建一个名为 RandomGen
的 class 并创建一个 GameObject 并将其命名为 RANDOMOBJ。将 RandomGen
脚本附加到 RANDOMOBJ 游戏对象。
不要复制它(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
}
将此方法添加到您的 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;
}
此代码 returns 您提供的数组的随机副本。
我有一个脚本可以随机播放一个对象的行为。让我们说行为 1-坐,2-跳,3-走,4-运行。然后有一个附加到对象的脚本来改变对象的行为。例如,打乱后的行为是 3-1-2-4。当我复制对象时,所有复制的对象都具有相同的洗牌结果,因此所有对象的行为都是相同的。我想要的是不同的对象有不同的洗牌结果。我能想到的就是为每个对象制作不同的脚本,但效率不高。
[编辑] 这是附加到对象的脚本
using UnityEngine;
using System.Collections;
public class StudentScript : MonoBehaviour {
private System.Random _random = new System.Random();
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;
Shuffle(array);
foreach (int value in array)
{
Debug.Log(value);
}
}
void Update () {
sec+=Time.deltaTime;
if (sec >= 3f && m<5 && animator.GetInteger ("Behav") == 0) {
StudentBehaviour(array[m]);
}
//Debug.Log ("sec "+sec);
if (animator.GetInteger ("Behav") != 0) {
if (sec >= 5)
animator.SetTrigger ("ToDont");
if (sec >= 10)
animator.SetTrigger ("ToEffect");
}
}
public void StudentBehaviour(int n){
animator.SetInteger ("Behav", n);
sec = 0f;
Debug.Log ("jadi "+n);
}
public void ResetStudentBehaviour(){
if (animator.GetInteger ("Behav") != 0) {
pengawasAnim.SetTrigger("Approach");
if (sec >= 0f && sec <=5f) {
signAnim.SetTrigger ("ToYellow");
animator.SetTrigger ("Told1");
gm.AddScore (5);
}else if (sec >= 5f && sec <=10f) {
signAnim.SetTrigger ("ToOrange");
animator.SetTrigger ("Told2");
animator.ResetTrigger ("ToDont");
gm.AddScore (3);
}else if (sec >= 10f) {
signAnim.SetTrigger ("ToRed");
animator.SetTrigger ("Told3");
animator.ResetTrigger ("ToEffect");
gm.AddScore (1);
}
animator.SetInteger ("Behav", 0);
sec = 0f;
Debug.Log ("reset");
if (m < 5) {
m++;
}
Debug.Log ("m = " + m);
Debug.Log ("sec "+sec);
}else
Debug.Log ("student done <3");
}
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;
}
}
我想要的是复制学生(带护目镜的那个),这样每个学生的行为就会不同
使用:
int r = Random.value*n;
或:
int r = Random.Range(0,n);
而不是:
int r = _random.Next(0, n);
在您的 Shuffle() 方法中
问题出在 private System.Random _random = new System.Random();
行。
只需在该行前面添加 static
关键字。
static private System.Random _random = new System.Random();
这解决了问题。尽管有时,来自不同对象实例的随机数是相同的,但这种情况很少见。为了减少不同对象获得相同随机数的概率,为Shuffle(int[] array)
函数指定一个class和游戏对象,然后从多个实例中调用该函数StudentScript
class。
因此创建一个名为 RandomGen
的 class 并创建一个 GameObject 并将其命名为 RANDOMOBJ。将 RandomGen
脚本附加到 RANDOMOBJ 游戏对象。
不要复制它(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
}
将此方法添加到您的 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;
}
此代码 returns 您提供的数组的随机副本。