Unity游戏开发的数学与物理 4 ( 在物体运动中加入重力 )

在物体运动中加入重力

实现注意:

  • 使用级数叠加算法 y += vy
  • 对位置上的加速度 vy += GR
  • 速度上的加速度 GR为重力加速度,在计算机中使用的加速度单位是特殊的dot/F^2 (像素/平方帧),而不是9.8 m/s^2
    (米/平方秒)
  • 微分是一种操作,是一种求微分系数的操作, 而微分系数是指函数关于某个值的变化率,这个概念在游戏开发中经常被用来考察某个函数变化
using UnityEngine;
using System.Collections;

//在物体运动中加入重力
public class ParabolicMotionTest : MonoBehaviour
{
    //物体的X位置
    float posX = 0;

    //物体的Y位置
    float posY = 0;

    //物体在x方向上的速度
    float speedX = 0;

    //物体在y方向上的速度
    float speedY = -8;

    //屏幕的右上像素在世界空间的坐标
    Vector3 ScreenRightTopPos;

    //屏幕的左下像素在世界空间的坐标
    Vector3 ScreenLeftBottomPos;

    //box的半宽度
    float boxHalfWidth;

    //运行时间
    float runTime;

    //重力加速度
    const float GR = 0.5f;

    //物体出生位置
    Vector2 bornPos;

    void Start()
    {
        //将屏幕右上的像素转换为世界空间的坐标
        ScreenRightTopPos = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));

        //将屏幕右下的像素转换为世界空间的坐标
        ScreenLeftBottomPos = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, 0));

        //box的半宽度,因为box是正方形
        boxHalfWidth = transform.localScale.x * 0.5f;

        //出生位置 左上角
        bornPos = new Vector2(ScreenLeftBottomPos.x + boxHalfWidth, ScreenRightTopPos.y - boxHalfWidth);

        //初始位置屏幕左上角
        transform.localPosition = new Vector3(bornPos.x, bornPos.y, 0);
    }

    void Update()
    {
        //检测,如果物体出了界面,让其重新到bornPos点
        if (posX - boxHalfWidth >= ScreenRightTopPos.x
            || posX + boxHalfWidth <= ScreenLeftBottomPos.x
            || posY - boxHalfWidth >= ScreenRightTopPos.y
            || posY + boxHalfWidth <= ScreenLeftBottomPos.y)
        {
            //运行时间归0
            runTime = 0f;
        }

        //x方向每帧时间内的位移到的值
        posX = speedX * runTime + bornPos.x;

        //y方向每帧时间内的位移到的值
        posY = (0.5f * GR * runTime * runTime) + (speedY * runTime) + bornPos.y;

        //设置该帧的位置
        transform.localPosition = new Vector3(posX, posY, 0);

        //时间的改变值
        runTime += Time.deltaTime;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值