从不同的预制件中生成不同的物品

时间:2018-02-21 16:34:30

标签: c# unity3d

一些塞尔达的典型灌木具有破坏它的典型奖励然后我有这个代码来管理它:

 private void OnTriggerEnter2D(Collider2D collision)
 {

     if (collision.CompareTag("Player"))
     {
         anim.SetTrigger("isTrigger");
         this.GetComponent<AudioSource>().PlayOneShot(grassSound);
         coll.enabled = false;

         //Spawn Items
         System.Random rnd = new System.Random();
         drop = rnd.Next(1, 31);

         if ((drop >= 1) && (drop <= 10))
         {
             Invoke("InstCoin", 0.2f);
         }
         else if ((drop >= 27) && (drop <= 30))
         {
             Invoke("InstHeart", 0.2f);
         }

         Invoke("HideSprite", 0.8f);
     }
 }

 private void HideSprite()
 {
     Destroy(gameObject);
 }

 private void InstCoin()
 {
     Instantiate(coin).transform.position = gameObject.transform.position;
 }
 private void InstHeart()
 {
     Instantiate(heart).transform.position = gameObject.transform.position;
 }

但是当我同时用1个对撞机击中2个预制件(同一个物体)时(因为它的瞬间产生了一个攻击对手),我生成一个随机数,引用一个项目(硬币,心脏或没有)。

当我从两个预制件中获得相同项目的时候出现问题,我认为这是因为随机函数生成一个数字(来自某个内部时钟),然后在两个函数上使用相同的数字因为“工作”在同一时间,但不知道...

我不知道如何解决这个问题导致这两个预制件在同一时刻被破坏。

尝试保存一个浮点数生成的最后一个数字,如果相同则重新输入随机数,但后来我错过了在两个预制件上独立获得相同数字的可能性,同时又不知道如何在同一时刻写同一个var。

1 个答案:

答案 0 :(得分:0)

System.Random rnd = new System.Random();
drop = rnd.Next(1, 31);

这是我认为你问的问题。如果两个碰撞器同时被击中,那么它们将产生与你

相同的随机数
  1. 在碰撞时创建随机对象并调用下一个
  2. 不使用种子
  3.   

    我认为其原因是随机功能产生一个数字(来自某个内部时钟)

    正确!他们都将计算相同的数字。这是他们第一次开始使用Random类时遇到的一个非常常见的问题:)

    要解决此问题,您可以使用种子生成随机数。当您实例化预制件时,您可以传递一个唯一的编号来生成它们的种子。

相关问题