您好我正在使用此代码让对象在y轴上移动。
using UnityEngine;
using System.Collections;
public class TargetMovementVertical : MonoBehaviour
{
public int maxSpeed;
private Vector3 startPosition;
// Use this for initialization
void Start ()
{
startPosition = transform.position;
}
// Update is called once per frame
void Update ()
{
MoveVertical ();
}
void MoveVertical()
{
transform.position = new Vector3(transform.position.x, Mathf.Sin(Time.time * maxSpeed), transform.position.z);
if(transform.position.y > 1.0f)
{
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z);
}
else if(transform.position.y < -1.0f)
{
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z);
}
}
}
我唯一的问题是对象只在1和-1之间移动,我想让它们向下移动。有可能吗?
答案 0 :(得分:2)
在您的代码中,您使用以下行设置位置:
transform.position = new Vector3(transform.position.x, Mathf.Sin(Time.time * maxSpeed), transform.position.z);
此处,唯一正在更改的坐标是y
坐标。它会根据函数Mathf.Sin
而变化。
如果你阅读Mathf.Sin
的文档,你会发现它返回的值介于-1和+1之间。
这就是为什么......
对象仅在1和-1之间移动
简单的解决方案是将Mathf.Sin
的结果乘以某个因子。
这是正弦函数:
红色情节:y = sin(x)
如您所见,正弦函数的range为[-1, 1]
。因此,无论您在函数中输入什么输入值,都会在[-1, 1]
区间内得到结果。
如果您将输入相乘,则需要更改正弦波的频率,例如:
红色情节:y = sin(5x)
观察到在函数内放置一个因子不会影响波的幅度。与以下内容比较:
红色情节:y = 5sin(x)
上图与先前的图不同,其范围为[-5, 5]
。
在这里你可以看到它们全部用于比较:
红色情节:5sin(x)
蓝色情节:sin(x)
紫色情节:罪(5x)
这些图是使用meta-calculator的图形计算器创建的。如果你不想接受我的话,你可以自己尝试这里的功能。
要理解为什么sin函数具有这种形状,请记住正弦函数采用一个角度并返回与水平方向成角度的单位向量的垂直分量...
我的意思是:
正弦和余弦的单位圆,θ= 45度。
由于我们采用单位向量(我们正在处理单位圆),因此垂直(正弦)将采用的最大值为1,最小值为-1。
为了理解我们上面看到的正弦图是如何产生的,我希望这个动画能让它更清晰:
动画显示正弦函数(红色)y = sin(θ)是如何从单位圆上的点(绿色)的y坐标(红点)以θ角度绘制的弧度。
正如我在答案开始时所说,如果你想缩放移动,你可以通过将结果乘以某个因子来将振幅改变为正弦波,例如:Mathf.Sin(angle) * amplitude
。
该amplitude
值将告知值将达到多远,也就是说,通过Mathf.Sin
乘以amplitude
,您获得- amplitude
范围内的值和{ {1}}。
我希望你发现这种方法合理地知道它背后的推理已经呈现。
我希望上面的解释清楚地表明正弦函数不能保留因子。那就是:+ amplitude
。换句话说,正弦函数不能通过缩放传递,原因是正弦函数不是线性变换。