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

在物体运动中加入重力

实现注意:

  • 使用级数叠加算法
  • 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

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

Unity游戏开发的数学与物理 1 ( 物体延水平方向运动 )

物体延水平方向运动 工程实现需注意: - 摄像机的设置 Projection Orthographic - Start() 和 Update()的执行顺序与执行次数 - 屏幕坐标与空间坐标的转换 - 关于Time.deltaTime - x += v; v = -v; using UnityEngine; using System.Collections; //匀速运动 public class UnirormMotionTest : MonoBehaviour { //物体的位置 float

Unity游戏开发的数学与物理 2 ( 通过键盘控制物体的运动 )

通过键盘控制物体的运动 实现需注意: 获取键盘相应的方法 边界检测 合力方向的速度处理 勾股定理 using UnityEngine; using System.Collections; //通过键盘控制物体的运动 public class KeyControlMotionTest : MonoBehaviour { //物体的X位置 float posX = 0; //物体的Y位置 float posY = 0; //物体在x方向上的速度 float speedX = 1; //物体在y方向上

Unity游戏开发的数学与物理 3 ( 让物体延任意方向移动 )

让物体延任意方向移动 实现需注意: 三角函数 正弦 余弦 弧度 计算机程序使用弧度 避免产生极大的弧度值 using UnityEngine; using System.Collections; //实现一个box从原点向每次变化(2.0f * Mathf.PI) / 10.0f的角度方向移动 //移动出屏幕后再由原点开始下次移动 public class AnyDirectionMotionTest : MonoBehaviour { //物体的X位置 float posX = 0; //物体

unity游戏开发看什么书?

Unity游戏引擎集合了开发一个游戏所需要的大部分工具.组件.环境等内容.就像拍一部电影,我们需要摄像机.摇臂.灯光.挑干等基础工具.做游戏也需要摄像机.灯光.地形.人物控制器等组件.unity游戏开发看什么书?这里给大家推荐两本:一.<3D 数学基础>这本有趣的书介绍了模拟和渲染3D世界所需的基本数学知识,涵盖了理论知识和C++实现代码.理论部分解释3D中数学和几何之间的关系,列出的技巧与公式可以当做参考手册以方便查找.实现部分演示了怎样用代码来实现这些理论概念.编程示例语言使用的是C++,

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中应用很广泛的序列化技术Google的ProtoBuf,所以本文也是按照ProtoBuf的方式来操作的.ProtoBuf是一个开源库,简单来说ProtoBuf就是一个能使序列化的数据变得更小的类库,当然这里指的更小是相对的.好了ProtBuf的东西就不在多说,以后会专门写一篇帖子的.本帖其实就相当于上

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其实这样到游戏中还是不能用的.主要有两个方面,1.bin文件的后缀使我们随便取的名字,但是这种文件Unity不买账.因为Unity中的二进制文件必须是以.bytes命名的.2.在写文件之前其实还可以对二进制进行压缩,这样可以最大化节省设备空间.也就是说我们在生成数据实例后还需要做以下几件事:序列化 -

Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动

Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动 使用cookie类型的纹理模拟云层的移动 现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着云层移动,影子也跟着运动,如图3-28所示. 图3-28  天空中的云朵与大地上的影子 要在游戏中,模拟与之类似的大气现象时,就需要使用cookie类型的纹理. 制作云层效果的纹理 本小节将使用PhotoShop绘制有云层效果的纹理图,然后为其添加透明度信息.具体操作过程如下: (1)使用Photo

Unity 游戏开发技巧集锦之创建透明的材质

Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示.在Unity中,可以创建模拟了透明效果的材质,这也是本节主要讲解的内容. 图3-23  半透明的卡片 Unity创建并配置材质 在Project视图里,创建一个材质,并命名为TransMaterial,选中它然后在Inspector视图里修改Shader属性为Transparent/Diffuse,

?Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明朝传奇>中的篝火,如图2-32所示.粒子系统的最新版本也被称做忍者飞镖(Shuriken),因为场景中添加的粒子系统酷似忍者飞镖,如图2-33所示. 图2-32  游戏中的篝火               图2-33  粒子系统,也被称为忍者飞镖 unity中粒子基本属性 在使用粒子系统前,先了解一下它