美文网首页
Unity中,物体以指定曲线形态移动至目标位置

Unity中,物体以指定曲线形态移动至目标位置

作者: 全新的饭 | 来源:发表于2024-01-22 11:46 被阅读0次

    说明

    1. 在xoz平面内,物体在指定时间内从A点移动至B点。
    2. B点可以是一个实时运动的点。
    3. 物体的Y坐标根据实际配置的曲线得到。
      这里的Y(xoz平面)实际也可以是X(yoz平面)或Z(xoy平面)。

    使用方式

    调用FanCurveMoveObj.Move(),传入移动所需的参数。

    实现

    FanCurveMoveObj.cs
    其中包含

    1. 2个类
      FanCurveMoveObj:移动物体
      FanCurveMoveModel:移动所需参数
    2. 1个枚举
      FanActualYAxis:移动定义中的Y对应的实际的坐标轴
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class FanCurveMoveObj : MonoBehaviour
    {
    
        public void Init()
        { }
        public void Destroy()
        {
            DestroyMove();
        }
        private IEnumerator _moveCoroutine;
        public void Move(FanCurveMoveModel model)
        {
            DestroyMove();
            _moveCoroutine = MoveCoroutine(model);
            Utils.StartCoroutine(_moveCoroutine);
    
            IEnumerator MoveCoroutine(FanCurveMoveModel model)
            {
                SetPos(AdjustPos(model.BeginPos, model.EndPos, model.YCurve, 0));
                float timer = 0f;
                while (timer < model.MoveDurationSeconds)
                {
                    SetPos(AdjustPos(model.BeginPos, model.EndPos, model.YCurve, timer / model.MoveDurationSeconds));
                    timer += Time.deltaTime;
                    yield return null;
                }
                SetPos(AdjustPos(model.BeginPos, model.EndPos, model.YCurve, 1));
    
            }
    
            void SetPos(Vector3 pos)
            {
                transform.position = pos;
            }
            Vector3 AdjustPos(Vector3 beginPos, Vector3 endPos, AnimationCurve curve, float ratio)
            {
                ratio = Mathf.Clamp01(ratio);
                var pos = Vector3.Lerp(beginPos, endPos, ratio);
                float actualY = model.BaseY + model.YFactor * model.YCurve.Evaluate(ratio);
                switch (model.YAxis)
                {
                    case FanActualYAxis.X:
                        pos.x = actualY;
                        break;
                    case FanActualYAxis.Y:
                        pos.y = actualY;
                        break;
                    case FanActualYAxis.Z:
                        pos.z = actualY;
                        break;
                    default:
                        break;
                }
                return pos;
            }
        }
    
        private void DestroyMove()
        {
            Utils.DestroyCoroutine(ref _moveCoroutine);
        }
    }
    
    [System.Serializable]
    public class FanCurveMoveModel
    {
        public Vector3 BeginPos;
        public Transform EndTrans;
        public Vector3 EndPos => EndTrans.position;
        public float MoveDurationSeconds;
        public FanActualYAxis YAxis;
        public float BaseY;
        public float YFactor;
        public AnimationCurve YCurve;
    }
    public enum FanActualYAxis
    {
        None,
        X,
        Y,
        Z
    }
    

    相关文章

      网友评论

          本文标题:Unity中,物体以指定曲线形态移动至目标位置

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