在以下代码的最后第二行代码中,使用AddForce()方法,我不明白为什么需要找到方向和大小并将它们相乘以使其成为Vector2参数这样一个漫长的过程,而我们只需将参数作为new Vector2即可完成(* 一个x分量,一个y分量 *)。我不明白这样做的目的是什么?
或者,我不明白**new Vector2(* 一个x分量,一个y分量 *)**是什么意思。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// A teddy bear
/// </summary>
public class TeddyBear : MonoBehaviour
{
/// <summary>
/// Start is called before the first frame update
/// </summary>
void Start()
{
// get the teddy bear moving
const float MinImpulseForce = 3f;
const float MaxImpulseForce = 5f;
float magnitude = Random.Range(MinImpulseForce, MaxImpulseForce);
float angle = Random.Range(Mathf.PI / 2, Mathf.PI);
Vector2 direction = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
GetComponent<Rigidbody2D>().AddForce(
direction * magnitude , ForceMode2D.Impulse);
}
}
1条答案
按热度按时间rdrgkggo1#
这不是关于向量的,而是关于伪随机数的分布。当你使用
Random.Range
时,数字(非常接近)均匀地分布在那个范围内。你会看到不是所有的向量都是可能的。事实上,可能的向量以特定的形状存在,重要的是可能的向量可以存在的形状。以及它们在那个形状中的分布。他们可以生成一个随机的
x
和一个随机的y
坐标,这将确保向量在这些变量中均匀分布,这意味着可能的向量可以存在于一个正方形中(或者如果x
和y
的范围不同,则为矩形)。那么在每个方向和距离上得到向量的概率就不会是一致的(例如,在正方形的角的方向上,向量可能离中心更远)。另一种思考方式是
x
和y
是独立的,但结果是angle
和distance
之间存在相关性。相反,他们希望生成极坐标中的数字,换句话说,通过
angle
和distance
(在这个例子中他们称之为magnitud
),这样他们就知道向量在这些变量中是均匀分布的。这也意味着可能的向量可以存在于一个圆中。* 重申一下,这确保了angle
或distance
之间没有相关性。*这就是你在这里看到的:
嗯......实际上,这并不是整个Angular 范围,所以这不是一个完整的圆,而是一个扇形圆。并且假设
MinImpulseForce
可能不是零(实际上是3f
),所以这实际上是一个扇形环,一个圆环(一个2D圆环的扇形)。* 重申一下:可能存在的向量的形状是很重要的。既然他们决定使用极坐标,向量构造函数取x和y,他们就做了一个极坐标到笛卡尔坐标的转换,如下所示:
magnitude
。*那是一样的:
但使用向量标量乘法的时间更短。