首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity -不能让对象在适当的位置振动/悬停吗?

Unity -不能让对象在适当的位置振动/悬停吗?
EN

Stack Overflow用户
提问于 2018-12-06 05:26:35
回答 2查看 1.4K关注 0票数 0

好的,我有一堆立方体,我只需要在太空中缓慢地振动/摇动,就像几乎在悬停一样。我首先尝试使用带有噪声的粒子发射器,但无法获得运动部分。我现在正在尝试将脚本附加到每个对象:

代码语言:javascript
复制
 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);

    }

这样,立方体就完全消失了。

EN

回答 2

Stack Overflow用户

发布于 2018-12-06 11:50:58

理想情况下,您应该使用诸如LeanTween之类的包来处理您的过渡/动画,至少在这样的简单、小规模的情况下是这样。

本质上,这个过程是这样的:

代码语言:javascript
复制
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场景,但你应该能够很容易地将其展平):

代码语言:javascript
复制
    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;
    }
票数 0
EN

Stack Overflow用户

发布于 2020-12-19 06:50:49

我今天用三个叠加的Sin波解决了这个问题;它很简单,并且提供了一个很好的随机围绕一个圆圈的效果,并且不需要跟踪对象的位置:

代码语言:javascript
复制
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并执行以下操作:

代码语言:javascript
复制
hoverSpeed = Mathf.Clamp(hoverSpeed + Time.deltaTime, 0, hoverMaxSpeed);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53641019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档