好的,我有一堆立方体,我只需要在太空中缓慢地振动/摇动,就像几乎在悬停一样。我首先尝试使用带有噪声的粒子发射器,但无法获得运动部分。我现在正在尝试将脚本附加到每个对象:
float speed = 1.0f; //how fast it shakes
float amount = 1.0f;
public Vector2 startingPos;
void Awake()
{
startingPos.x = transform.position.x;
startingPos.y = transform.position.y;
}
// Update is called once per frame
void Update()
{
float newx = startingPos.x + (Mathf.Sin(Time.time * speed) * amount);
float newy = startingPos.y + (Mathf.Sin(Time.time * speed) * amount);
transform.position = new Vector3(newx, newy, transform.position.z);
}这样,立方体就完全消失了。
发布于 2018-12-06 11:50:58
理想情况下,您应该使用诸如LeanTween之类的包来处理您的过渡/动画,至少在这样的简单、小规模的情况下是这样。
本质上,这个过程是这样的:
On Start:
store 'starting' position
On Enabled:
Run DoHover
On DoHover:
Pick random offset within radius (Random.insideUnitCircle() * radius)
LeanTween current transform to startingPos + offset over timeDelay
Set LeanTween.OnComplete to run DoHover如果你决定不使用第三方软件包来管理你的补间,你可以试试这个(我使用3D场景,但你应该能够很容易地将其展平):
private const float threshold = 0.02f;
private Vector3 startingPos;
private Vector3 destinationPos;
private Vector3 velocity;
public float radius = 0.1f;
public float minTimeDelay = 0.1f;
public float maxTimeDelay = 0.3f;
private void Start() {
startingPos = destinationPos = transform.position;
}
// This is a 'physics' frame update
public void FixedUpdate() {
if ( Vector3.Distance(transform.position, destinationPos) < threshold ) {
// Pick new destination and speed
destinationPos = startingPos + Random.insideUnitSphere * radius;
velocity = (destinationPos - transform.position) / Random.Range(minTimeDelay, maxTimeDelay);
}
// Move toward destination
transform.position += velocity * Time.fixedDeltaTime;
}发布于 2020-12-19 06:50:49
我今天用三个叠加的Sin波解决了这个问题;它很简单,并且提供了一个很好的随机围绕一个圆圈的效果,并且不需要跟踪对象的位置:
transform.position.x = originalPosition.x + hoverSpeed * (
Mathf.Sin(Time.time / 3)
+ Mathf.Sin(Time.time / 7)
+ Mathf.Sin(Time.time / 11)
);
transform.position.y = originalPosition.y + hoverSpeed * (
Mathf.Sin(Time.time / 2)
+ Mathf.Sin(Time.time / 5)
+ Mathf.Sin(Time.time / 13)
);
我还从originalPosition开始创建对象,然后逐步向外移动,从零开始创建hoverSpeed并执行以下操作:
hoverSpeed = Mathf.Clamp(hoverSpeed + Time.deltaTime, 0, hoverMaxSpeed);
https://stackoverflow.com/questions/53641019
复制相似问题