捕鱼游戏中获得金币移动展示

在玩捕鱼游戏时候看到金币获得移动表现,那么作为一个程序员就会想这个表现是怎么实现,如果我来弄又是怎么方法!在这里我将自己的实现和想法写下来。

经过观察和发现,渔场金币表现分为:先将N个金币爆炸开,在回收,最后进行移动到目标位置。

具体逻辑看下面代码:

抛物线下运动代码

using UnityEngine;

public class ParabolaPath
{
    public bool isClampStartEnd;
    private Vector3 m_start;
    private Vector3 m_end;
    private float m_height;
    private float m_gravity;
    private float m_upTime;
    private float m_downTime;
    private float m_totalTime;
    private Vector3 m_velocityStart;
    private Vector3 m_position;
    private float m_time;

    /// <summary> 初始化 </summary>
    /// <param name="start">开始点</param>
    /// <param name="end">结束点</param>
    /// <param name="height">高度</param>
    /// <param name="gravity">重力加速度</param>
    /// <returns></returns>
    public void Init(Vector3 start, Vector3 end, float height = 10, float gravity = -9.8f)
    {
        float topY = Mathf.Max(start.y, end.y) + height;
        float d1 = topY - start.y;
        float d2 = topY - end.y;
        float g2 = 2 / -gravity;
        float t1 = Mathf.Sqrt(g2 * d1);
        float t2 = Mathf.Sqrt(g2 * d2);
        float t = t1 + t2;
        float vX = (end.x - start.x) / t;
        float vZ = (end.z - start.z) / t;
        float vY = -gravity * t1;
        m_start = start;
        m_end = end;
        m_height = height;
        m_gravity = gravity;
        m_upTime = t1;
        m_downTime = t2;
        m_totalTime = t;
        m_velocityStart = new Vector3(vX, vY, vZ);
        m_position = m_start;
        m_time = 0;
    }

    /// <summary> 起点 </summary>
    public Vector3 start { get { return m_start; } }
    /// <summary> 终点 </summary>
    public Vector3 end { get { return m_end; } }
    /// <summary> 目标高度 </summary>
    public float height { get { return m_height; } }
    /// <summary>  重力加速度 </summary>
    public float gravity { get { return m_gravity; } }
    /// <summary> 上升时间 </summary>
    public float upTime { get { return m_upTime; } }
    /// <summary> 下降时间 </summary>
    public float downTime { get { return m_downTime; } }
    /// <summary>  总运动时间 </summary>
    public float totalTime { get { return m_totalTime; } }
    /// <summary> 顶点 </summary>
    public Vector3 top { get { return GetPosition(m_upTime); } }
    /// <summary> 初始速度  </summary>
    public Vector3 velocityStart { get { return m_velocityStart; } }
    /// <summary> 当前位置 </summary>
    public Vector3 position { get { return m_position; } }
    /// <summary> 当前速度 </summary>
    public Vector3 velocity { get { return GetVelocity(m_time); } }

    /// <summary> 当前时间 </summary>
    public float time
    {
        get { return m_time; }
        set
        {
            if (isClampStartEnd) value = Mathf.Clamp(value, 0, m_totalTime);
            m_time = value;
            m_position = GetPosition(value);
        }
    }

    /// <summary> 获取某个时间点的位置 </summary>
    public Vector3 GetPosition(float time)
    {
        if (time == 0) return m_start;
        if (time == m_totalTime) return m_end;
        float dY = 0.5f * m_gravity * time * time;
        return m_start + m_velocityStart * time + new Vector3(0, dY, 0);
    }

    /// <summary> 获取某个时间点的速度</summary>
    public Vector3 GetVelocity(float time)
    {
        if (time == 0) return m_velocityStart;
        return m_velocityStart + new Vector3(0, m_velocityStart.y + m_gravity * time, 0);
    }
}

曲线运动方法 对DG.Tweening的运用

using DG.Tweening;
using UnityEngine;
    public class MoveItme : MonoBehaviour
    {
        //移动持续时间
        private float m_MoveTime = 2.0f;
        //加速移动倍数
        private float m_MoveRate = 2.0f;
        //开始位置
        private Vector3 m_StartPos = Vector3.zero;
        //目标位置
        private Vector3 m_TargetPos = Vector3.zero;
        //移动方式
        private Ease m_Ease;

        /// <summary>
        /// 设置移动
        /// </summary>
        /// <param name="movetime">移动持续时间</param>
        /// <param name="moverate">加速移动倍数</param>
        /// <param name="ease">移动方式  : Ease.Linear </param>
        /// <param name="startpos">开始位置</param>
        /// <param name="targetpos">目标位置</param>
        /// <param name="callback">回调</param>
        public void SetMove(float movetime, float moverate, int ease, Vector3 startpos, Vector3 targetpos, System.Action callback)
        {
            m_MoveTime = movetime;
            m_MoveRate = moverate;
            m_Ease = (Ease)ease;
            m_StartPos = startpos;
            m_TargetPos = targetpos;
            MoveLocal(callback);
        }

        void MoveLocal(System.Action callback)
        {
            transform.localPosition = m_StartPos;
            Tweener m_Tweener = transform.DOLocalMove(m_TargetPos, m_MoveTime);
            if (m_Tweener != null)
            {
                m_Tweener.timeScale = m_MoveRate;
                m_Tweener.SetEase(m_Ease);
                m_Tweener.OnComplete(() =>
                {
                    if (callback != null)
                    {
                        callback();
                    }
                });
            }
        }
    }

----------------------------------------------

以下是对上面的方法调用逻辑

using System;
using UnityEngine;

public class ParabolaPathUtils : MonoBehaviour
    {
        public Vector3 target;        // 目标
        public float height = 16f;      // 高度
        public float gravity = -1000.0f;   // 重力加速度
        private ParabolaPath path;      // 抛物线运动轨迹
        private bool isplay = false;
        public Action callback;

        public void SetStart()
        {
            path = new ParabolaPath();
            path.Init(transform.localPosition, target, height, gravity);
            path.isClampStartEnd = true;
            isplay = true;
        }

        private void Update()
        {
            if (!isplay)
            {
                return;
            }
            // 计算位移
            float t = Time.deltaTime;
            path.time += t;
            transform.localPosition = path.position;

            // 计算转向
            //transform.LookAt(path.GetPosition(path.time + t));

            // 简单模拟一下碰撞检测
            if (path.time >= path.totalTime)
            {
                isplay = false;
                if (callback != null)
                {
                    callback();
                }
            }
        }
    }

 调用表现

using System.Collections;
using UnityEngine;
public class MoveTest : MonoBehaviour
{
    public GameObject obj;
    public GameObject _ObjStartVec3;
    public GameObject _ObjEndVec3;
    public float movetime = 1.0f;
    public float moverate = 5.0f;
    public Vector2 RandomVec = Vector2.zero;
    public int ease = 1;
    public float gravity = -2000;
    public float height = 20;

    Vector3 StartVec3;
    Vector3 EndVec3;

    void Start()
    {
        StartVec3 = _ObjStartVec3.transform.localPosition;
        EndVec3 = _ObjEndVec3.transform.localPosition;

        for (int i=0;i<10;i++)
        {
            InitModel(i);
        }
    }

    void InitModel(int index)
    {
        GameObject _obj = Instantiate(obj) as GameObject;
        if(_obj==null)
        {
            return;
        }
        _obj.transform.parent = this.gameObject.transform;
        _obj.transform.localPosition = StartVec3;
        Vector2 Vec = Random.insideUnitCircle;
        Vector3 Pos = StartVec3 + (new Vector3(Vec.x * RandomVec.x, Vec.y * RandomVec.y));
        MoveItme mMoveItme = _obj.transform.GetComponent<MoveItme>();
        if(mMoveItme==null)
        {
            mMoveItme = _obj.gameObject.AddComponent<MoveItme>();
        }
        mMoveItme.SetMove(movetime, moverate, ease, StartVec3, Pos, () => {
            StartCoroutine(OnWait(index, mMoveItme, Pos));
        });
    }

    IEnumerator OnWait(int index, MoveItme mMoveItme,Vector3 Pos)
    {
        yield return new WaitForSeconds(index + 0.5f);
        mMoveItme.SetMove(movetime, moverate, ease, Pos, StartVec3,() => {
            ParabolaPathUtils mParabolaPathUtils = mMoveItme.transform.GetComponent<ParabolaPathUtils>();
            if (mParabolaPathUtils == null)
            {
                mParabolaPathUtils = mMoveItme.gameObject.AddComponent<ParabolaPathUtils>();
            }
            mParabolaPathUtils.callback = mCallBack;
            mParabolaPathUtils.gravity = gravity;
            mParabolaPathUtils.height = height;
            mParabolaPathUtils.target = EndVec3;
            mParabolaPathUtils.SetStart();
        });
    }

    void mCallBack()
    {
        Debug.Log("--mCallBack--");
    }
}

具体的看实例工程

--------------

资源审核中,完后补充资源链接

https://download.csdn.net/download/sun__ch/12319933

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值