【问题标题】:Falling object gravity interval of time下落物体重力间隔时间
【发布时间】:2021-12-27 20:06:49
【问题描述】:

我编写了这段代码,其中我有 8 个对象,每个对象都有这个脚本,在随机时间间隔之间,对象随机下降

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class cylinderFallv2 : MonoBehaviour
 {
     private Rigidbody temp;
 
     // Start is called before the first frame update
     void Start()
     {
         temp = GetComponent<Rigidbody>();
         StartCoroutine(waitTime());
     }
 
     public IEnumerator waitTime() {
         temp.useGravity = false;
         float wait_time = Random.Range (3.0f;, 12.0f;);
         yield return new WaitForSeconds(wait_time);
         temp.useGravity = true;
     }
 
 }

他的意图是让物体一个接一个地落下,它们之间的间隔以随机顺序排列。有什么想法吗?

【问题讨论】:

  • 问题是什么?物体不是在下落,还是以意想不到的顺序下落?
  • 是的,我认为它们会一个接一个地下降,例如相差 1 秒,并且是随机顺序的。

标签: unity3d 3d coroutine gravity


【解决方案1】:

如果您想控制多个对象,并且它们之间存在某种关系,通常最好在任何 GameObject 上都有一个脚本,并让该脚本处理其他对象。以下示例脚本可以放置在任何 GameObject 上。

using System.Collections;
using System.Linq;
using UnityEngine;

public class RandomFall : MonoBehaviour
{
    public Rigidbody[] rigidbodies;
    public float minTime = 3.0f;
    public float maxTime = 12.0f;

    private void Start()
    {
        foreach (Rigidbody rigidbody in rigidbodies)
            rigidbody.useGravity = false;
        StartCoroutine(dropRandomly());
    }

    public IEnumerator dropRandomly()
    {
        foreach (var rigidbody in rigidbodies.OrderBy(r => Random.value))
        {
            float wait_time = Random.Range(minTime, maxTime);
            Debug.Log($"Waiting {wait_time:0.0} seconds...");
            yield return new WaitForSeconds(wait_time);
            Debug.Log($"Dropping {rigidbody.name}...");
            rigidbody.useGravity = true;
        }
        Debug.Log("All dropped!");
    }
}

然后您必须在场景编辑器中添加对要放置的对象的引用。它应该看起来像这样(我添加了四个气缸)。请注意,您尝试添加的对象当然必须已经具有刚体组件。

【讨论】:

  • 我建议不要复制列表和while 循环,而是使用 linq 并执行foreach(var rigidbody in rigidbodies.OrderBy(r =&gt; Random.value)),这对我来说似乎更干净;)
  • 确实,好多了——这里的旧习惯 :)。谢谢,我已经更新了答案。
  • 如果我这样做,例如“float wait_time = time;”时间是2.0f,每个气缸不应该每2秒下降一次吗?有时几个同时倒下。求帮助
  • 是的,只要您只有一个游戏对象上的脚本。我猜你在两个或更多游戏对象上有脚本(或脚本的另一个旧副本)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多