我想编制一个弹跳球。实际反弹不应遵循真实的物理定律,而应建立绝对的正弦波。就像在这张图片中一样
到目前为止,这很容易。请参阅附带的代码。
但是我想按一下按钮就会减慢球的移动速度。
我将降低移动速度,这将减慢x轴上的变换。但球仍然快速上下跳动,因为正弦波的频率和幅度都没有改变。但是当我改变其中一个或两个时,这将以一种奇怪的行为结束。
想象一下,球从下到上移动距离从上到下的20%。当我现在改变任何正弦参数时,球会立即在y轴上移动,看起来很奇怪而且不光滑。
所以我的实际问题是:如何在没有波动的情况下减慢绝对正弦波(x / y轴平移)?
float _movementSpeed = 10.0f;
float _sineFrequency = 5.0f;
float _sineMagnitude = 2.5f;
Vector3 _axis;
Vector3 _direction;
Vector3 _position;
void Awake()
{
_position = transform.position;
_axis = transform.up;
_direction = transform.right;
}
void Update()
{
_position += _direction * Time.deltaTime * _movementSpeed;
// Time.time is the time since the start of the game
transform.position = _position + _axis * Mathf.Abs(Mathf.Sin(Time.time * _sineFrequency)) * _sineMagnitude;
}
答案 0 :(得分:0)
我想你想要这个(更红 - 更低的频率,更蓝 - 更高):
实现此目的的最简单方法是缩放deltatime,例如,这是通过以下方式生成的:
using UnityEngine;
using System.Collections;
public class Bounce : MonoBehaviour {
// for visualisation of results
public Graph graph;
[Range(0, 10)]
public float frequency = 1;
float t;
void Update()
{
t += Time.deltaTime * frequency;
float y = Mathf.Abs(Mathf.Sin(t));
float time = Time.realtimeSinceStartup;
graph.AddPoint(time, y, Color.Lerp(Color.red, Color.blue, frequency/10));
}
}
为了完整性,Graph
类:
using UnityEngine;
using System.Collections.Generic;
public class Graph : MonoBehaviour {
struct PosAndColor
{
public Vector3 pos;
public Color color;
}
List<PosAndColor> values=new List<PosAndColor>();
public void AddPoint(float x, float y, Color c)
{
values.Add(new PosAndColor() { pos = new Vector3(x, y, 0), color = c });
}
void OnDrawGizmos()
{
for (int i = 1; i < values.Count; i++)
{
Gizmos.color = values[i - 1].color;
Gizmos.DrawLine(values[i - 1].pos, values[i].pos);
}
}
}
另一种方法是使用正弦偏移来改变频率以匹配当前幅度。我不认为你在这里需要这个,但如果你愿意我可以发表更多关于这个主题的内容。