Unity中抛物线的实现

什么是抛物线?

  以数学知识来定义的话,抛物线是在平面内到定点与定直线的距离相等的点的轨迹叫做抛物线。定点就是抛物线的焦点,定直线就是抛物线的准线。从物理上来说的话,抛物线就是将一个物体抛出去以后,物体运动的轨迹。当然,在Unity中我们是从物体的运动学的方面来研究的。

在Unity中什么时候需要用到抛物线呢?

  在Unity中,抛物线一般是用来描绘物体的运动轨迹,添加拖尾特效或者计算物体的预发射轨迹,用来实现物体的发射瞄准线的。在愤怒的小鸟中,大炮发射、弓箭射击等等游戏中都可以应用到。

抛物线运动的种类?

抛物线运动分为两种:
1.平抛运动:物体只具有水平方向的初速度,在被抛物以后,在水平方向做匀速运动,在竖直方向做自由落体运动(忽略其他的阻力影响)。如图所示:
斜抛运动图片
2.斜抛运动:不但在水平方向有初速度的水平分量,还有竖直方向上的初速度竖直分量,水平方向上做匀速直线运动,在竖直方向上做初速度不为零的匀变速运动,而不是自由落体运动
斜抛运动图片
很明显,在愤怒的小鸟和弓箭射击等等游戏中,物体都是做斜抛运动,所以本文也是主要研究斜抛运动!

斜抛轨迹实现的主要思路:

首先获得物体的物体的初速度,根据以上斜抛运动的思路我们可以将速度分为水平方向的速度和竖直方向的速度。在水平方向上,物体是做匀速直线运动,那么就直接利用公式Sx = Vxt就可以求出物体在水平方向上的位移。在竖直方向上,物体是做初速度不为零的匀变速运动,那么我们就需要利用公式:Sy = Vyt-0.5gt2来计算物体在竖直方向上的位移,其中g表示重力加速度,t表示运动的时间。最后将物体的初始位置,加上t时刻之后,物体在水平和竖直方向的位移就可以得到t时刻的位置了。然后我们只需要修改t的值就可以计算出整条轨迹啦!

实现代码如下:

博主实现的是愤怒的小鸟的瞄准线,具体代码如下:

    private void Draw(float distance)
    {
    
    
        Vector3 origin = transform.position;//记录当前位置
        //发射点和小鸟之间的位置相减就是初速度的方向,然后乘以抛出的力度和拉伸的距离
        Vector2 MoveSpeed = (firePoint.position - transform.position).normalized * throwSpeed * distance;
        //定义一个列表存放所有的计算的点
        List<Vector2> pointList = new List<Vector2>();
        pointList.Add(transform.position);//第一个点就是当前物体的点
        //通过第一个点逐步计算下一个点
        for (int i = 1; i < 50; i++)//随便先计算五十个点
        {
    
    
            float time = i * 0.02f * 5;//每隔0.1秒计算一次
            float timePow = time * time;//time的平方
            //下一个点
            Vector2 point = new Vector2(pointList.First().x + MoveSpeed.x * time, pointList.First().y + MoveSpeed.y * time - 0.5f * Physics2D.gravity.magnitude * timePow);
            //进行射线检测,判断和上一个是否有障碍阻挡,有阻挡就结束计算
            Ray2D ray2D = new Ray2D(pointList.Last(),point-pointList.Last());//创建射线
            RaycastHit2D hit = Physics2D.Raycast(ray2D.origin,ray2D.direction,Vector2.Distance(pointList.Last(),point));//发射射线
            if (hit.collider!=null)
            {
    
    
                Debug.Log("中间有障碍物阻挡了!!" + hit.collider.name);
                break;
            }
            else
            {
    
    
                pointList.Add(point);//加入到点的列表中
            }
        }
       }

然后遍历得到的pointList列表实例化你需要的轨迹圆圈或者其他物体就好啦。

效果图如图所示:

效果图

总结:

  添加了瞄准线的你是不是就像装了八倍镜一样百发百中了呢?总体实现起来不难的,只需要根据物理公式计算就好了。博主也是初学Unity,有不足欢迎各位大佬留言评论指教指正!

猜你喜欢

转载自blog.csdn.net/Wu_0526/article/details/116199341
今日推荐