美文网首页
Unity中,让物体沿弧线从起点向终点运动

Unity中,让物体沿弧线从起点向终点运动

作者: 全新的饭 | 来源:发表于2022-05-24 13:54 被阅读0次

思路

给定:起点、终点、“速度”、“高度”。

做法

  1. 根据“速度”算得运动总时长:运动总时长 = 起点到终点的距离 / 速度
  2. 让物体在运动总时长内,坐标从起点变到终点(Lerp的方式)
  3. 在上述过程中,要修改物体的PosY(加一个Offset):Offset = 高度 * y
    根据指定函数算得:该函数的自变量取值范围为0~1,在0和1时因变量值(y,高度系数值)为0。如:y = 1 - 4 *(x-0.5)^2
    也可以直接使用AnimationCurve画出期望的y在该过程中变化的曲线,同样要求在0和1时因变量值为0。

实现

效果


模拟抛物运动.gif

配置


image.png

示意代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 物体沿弧线移动测试
public class Fan_ThrowTest : MonoBehaviour
{
    [SerializeField]
    private GameObject _go;
    [SerializeField]
    private Transform _beginPosTrans;
    private Vector3 BeginPos{ get { return _beginPosTrans.position; } }
    [SerializeField]
    private Transform _endPosTrans;
    private Vector3 EndPos{ get { return _endPosTrans.position; } }
    [SerializeField]
    private float _moveSpeed;
    [SerializeField]
    private AnimationCurve _posYCurve;
    [SerializeField]
    private float _height;

    private IEnumerator _moveCoroutine;

    private void Start()
    {
        Init();
    }

    private void Update() 
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Move();
        }
    }

    private void OnDestroy()
    {
        Destroy();
    }
    
    public void Init()
    {
        
    }
    
    public void Destroy()
    {
        
    }

    private void Move()
    {
        if (_moveCoroutine != null)
        {
            StopCoroutine(_moveCoroutine);
            _moveCoroutine = null;
        }

        _moveCoroutine = MoveCoroutine();
        StartCoroutine(_moveCoroutine);
    }

    private IEnumerator MoveCoroutine()
    {
        float distance = Vector3.Distance(BeginPos, EndPos);
        float duration = distance / _moveSpeed;
        float timer = 0f;

        // 若是rigidbody,可以使用rigidbody.MovePostion(_beginPos),下同
        _go.transform.position = BeginPos;
        while (timer < duration)
        {
            float x = timer / duration;
            Vector3 nextPos = Vector3.Lerp(BeginPos, EndPos, timer / duration);
            // float y = 1 - 4 * (x - 0.5f) * (x - 0.5f);
            float y = _posYCurve.Evaluate(x);
            nextPos.y += y * _height;

            _go.transform.LookAt(nextPos, transform.forward);
            _go.transform.position = nextPos;

            timer += Time.deltaTime;
            yield return null;
        }

        _go.transform.position = EndPos;
    }
}

相关文章

  • Unity中,让物体沿弧线从起点向终点运动

    思路 给定:起点、终点、“速度”、“高度”。 做法 根据“速度”算得运动总时长:运动总时长 = 起点到终点的距离 ...

  • Css3 Animation 动画原则七

    弧线运动 (Arc) 虽然对象是更逼真了,当它们遵循「缓入缓出」的时候它们很少沿直线运动——它们倾向于沿弧线运动。...

  • 《终点亦起点》

    运动会检录。一百米的终点是八百米的起点,两百米的终点是一千五百米和三千米的起点。 终点亦起点。这个启发让生活中习惯...

  • Unity动画系统详解1:在Unity中如何制作动画?

    摘要:在场景中加入动态的物体,可以让整个场景更加生动、真实。Unity场景中的物体可以通过制作动画,让物体动起来。...

  • 正确使用Lerp

    Lerp功能 在unity中可以用于物体到达另外一个目标物体之间进行平滑过渡运动效果。 函数原型为Lerp(a,b...

  • 活着为了什么

    活着就为了活着。 从呱呱落地, 到入土为安, 人生从起点走到终点。 不过是一条弧线, 或是一条曲线, 没有直线。 ...

  • 一切膨胀都在收缩

    高速运动的物体,沿运动方向的长度比其静止时的长度短,自然运动的物体不可能只是朝着特定的某个方向运动,若运动是存在的...

  • 【诗】中间地带

    从无序从向无序 从尽头走向尽头 我们站在各自的起点 遥望彼此的起点 你的起点偏偏是我的终点 可中间一切的地带 都需...

  • 2021-09-01 Unity显示航迹

    (20条消息) Unity物体运动时画出轨迹_moonlightpeng的博客-CSDN博客[https://bl...

  • 对于javascript运动的理解

    运动原理: 对于javascript的运动简单的来说就是利用定时器让物体运动起来,并不断的改变物体的样式。在运动中...

网友评论

      本文标题:Unity中,让物体沿弧线从起点向终点运动

      本文链接:https://www.haomeiwen.com/subject/ptmjprtx.html