在物体运动中加入重力
实现注意:
- 使用级数叠加算法
- y += vy; //对位置上的加速度
- vy += GR; //速度上的加速度
- GR为重力加速度,在计算机中使用的加速度单位是特殊的dot/F^2 (像素/平方帧),而不是9.8 m/s^2 (米/平方秒)
- 微分是一种操作,是一种求微分系数的操作, 而微分系数是指函数关于某个值的变化率,这个概念在游戏开发中经常被用来考察某个函数变化的速度; f(x)关于x的变化率,基本的微分公式
- d/dx(x) = 1
- d/dx(x^2) = 2x
- d/dx(x^3) = 3x
- d/dx(x^n) = nx^(n-1)
- d/dx(sin x) = cos x
- d/dx(cos x) = -sin x
- 合成函数的微分,可以看做“对函数中又包含另一层函数的等式进行微分, 可以将其转化为对外层函数的微分乘以对内层函数的微分”
- 级数,就是将一个数列的每一项加起来得到的结果
- 积分与级数有相似的部分,从形式上来看是微分的逆运算
- 使用积分制作的抛物运动程序
- x = vx * t;
- y = (0.5f * GR * t * t) + (vy * t) + 200.0f;
- 以下代码使用积分制作抛物线
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.4f;
//物体出生位置
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)
{
//屏幕左上角
posX = bornPos.x;
posY = bornPos.y;
//运行时间归0
runTime = 0;
}
//x方向每帧时间内的位移到的值
posX = speedX * runTime;
//y方向每帧时间内的位移到的值
posY =(0.5f * GR * runTime * runTime) + (speedY * runTime) + bornPos.y;
//时间的改变值
runTime += Time.deltaTime;
//设置该帧的位置
transform.localPosition = new Vector3(posX, posY, 0);
}
}
时间: 2024-10-16 10:43:11