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

通过键盘控制物体的运动

实现需注意:

  • 获取键盘相应的方法
  • 边界检测
  • 合力方向的速度处理
  • 勾股定理
using UnityEngine;
using System.Collections;

//通过键盘控制物体的运动
public class KeyControlMotionTest : MonoBehaviour
{
    //物体的X位置
    float posX = 0;

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

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

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

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

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

    //box的半宽度
    float boxHalfWidth;

    readonly float Sqrt2;

    public KeyControlMotionTest()
    {
        //2的开方
        Sqrt2 = Mathf.Sqrt(2);
    }

    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;

        //初始位置
        transform.localPosition = new Vector3(posX, posY, 0);
    }

    void Update()
    {
        //按住左键
        if (IsLeftKey())
        {
            //按住左键且按住上键
            if (IsUpKey())
            {
                posX -= speedX / Sqrt2 * Time.deltaTime;
                posY += speedY / Sqrt2 * Time.deltaTime;
            }
            //按住左键且按住下键
            else if (IsDownKey())
            {
                posX -= speedX / Sqrt2 * Time.deltaTime;
                posY -= speedY / Sqrt2 * Time.deltaTime;
            }
            else
            {
                posX -= speedX * Time.deltaTime;
            }
        }
        //按住右键
        else if (IsRightKey())
        {
            //按住右键且按住上键
            if (IsUpKey())
            {
                posX += speedX / Sqrt2 * Time.deltaTime;
                posY += speedY / Sqrt2 * Time.deltaTime;
            }
            //按住右键且按住下键
            else if (IsDownKey())
            {
                posX += speedX / Sqrt2 * Time.deltaTime;
                posY -= speedY / Sqrt2 * Time.deltaTime;
            }
            else
            {
                posX += speedX * Time.deltaTime;
            }
        }
        //按住上键
        else if (IsUpKey())
        {
            posY += speedY * Time.deltaTime;
        }
        //按住下键
        else if (IsDownKey())
        {
            posY -= speedY * Time.deltaTime;
        }

        //边界检测 右
        if (posX + boxHalfWidth >= ScreenRightTopPos.x)
        {
            posX = ScreenRightTopPos.x - boxHalfWidth;
        }

        //边界检测 左
        if (posX - boxHalfWidth <= ScreenLeftBottomPos.x)
        {
            posX = ScreenLeftBottomPos.x + boxHalfWidth;
        }

        //边界检测 上
        if (posY + boxHalfWidth >= ScreenRightTopPos.y)
        {
            posY = ScreenRightTopPos.y - boxHalfWidth;
        }

        //边界检测 下
        if (posY - boxHalfWidth <= ScreenLeftBottomPos.y)
        {
            posY = ScreenLeftBottomPos.y + boxHalfWidth;
        }

        //设置当前物体的位置
        transform.localPosition = new Vector3(posX, posY, 0);
    }

    bool IsLeftKey()
    {
        //按住左键或者a键,都是向左
        if (Input.GetKey(KeyCode.LeftArrow)
            || Input.GetKey(KeyCode.A))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    bool IsUpKey()
    {
        //按住上键或者w键,都是向上
        if (Input.GetKey(KeyCode.UpArrow)
            || Input.GetKey(KeyCode.W))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    bool IsDownKey()
    {
        //按住下键或者s键,都是向下
        if (Input.GetKey(KeyCode.DownArrow)
            || Input.GetKey(KeyCode.S))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    bool IsRightKey()
    {
        //按住右键或者d键,都是向右
        if (Input.GetKey(KeyCode.RightArrow)
            || Input.GetKey(KeyCode.D))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
时间: 2024-10-29 19:08:31

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

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(

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

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

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中粒子基本属性 在使用粒子系统前,先了解一下它