Unity之C#学习笔记(2):键盘操控物体进行简单的移动 Simple Movement

您所在的位置:网站首页 unity3d车的移动代码 Unity之C#学习笔记(2):键盘操控物体进行简单的移动 Simple Movement

Unity之C#学习笔记(2):键盘操控物体进行简单的移动 Simple Movement

2024-04-02 00:41| 来源: 网络整理| 查看: 265

前篇链接:Unity之C#学习笔记(1):三种方式让你的脚本控制物体

在这一节,我们将实现用键盘操控一个物体进行上下左右的简单移动。

续接上节,我们创建了一个Player,一个PlayerController脚本。键盘操控物体移动,也就是当我们按下了特定的按键时,物体的position属性发生改变。我们先看如何让物体动起来。

最直接的方法是直接修改position的值。position是一个Vector3变量,我们就用上一帧的position在xyz三方向均+1作为新一帧的position。在Update函数中写

this.transform.position = new Vector3(transform.position.x + 1, transform.position.y + 1 , transform.position.z + 1);

运行游戏,你会发现自己的小方块已经能以很快的速度上天了。这是因为Update函数在每一帧都会被调用一次,而你的游戏帧数可能是几百上千FPS。

Unity还为我们提供了一个函数transform.translate(): 在这里插入图片描述 简单来说就是使物体移动translation这么多距离。这里我们用第一个函数就好了。传一个Vector3变量:

this.transform.Translate(new Vector3(1, 1, 1));

和上例效果一模一样。

但是我们实际上不想让Player移动得那么快,我们希望的是每秒移动一个距离,而不是每秒移动帧数*距离。解决方法是利用Unity提供的一个只读变量:Time.deltaTime,每帧的完成时间(单位为秒)。如果你用控制台打印一下这个变量,你会发现它是一个0.0几甚至更小的数。既然我们改变不了Update函数每帧都被调用,我们可以修改每帧移动的距离为deltaTime倍,就能实现同样的效果。

this.transform.Translate(new Vector3(1 * Time.deltaTime, 1 * Time.deltaTime , 1 * Time.deltaTime));

现在我们的立方体可以优雅地上天移动了。

解决了移动,接下来我们看如何用键盘操控。

我们知道,一个二维平面上任意方向的移动,都可以被分解为横纵(XY)两个方向的组合。在Unity中,这两个方向被称为“Horizontal”,水平,和“Vertical”,垂直。在Edit → Project Settings的Input栏,我们可以看到它们。 在这里插入图片描述 关注(Alt) Positive Button和(Alt) Negative Button栏。键盘的输入,本质上是每一个键位在一个时刻是否按下的信号。Positive Button对应的按键被按下时,这个方向会获得一个float型的一个正值,Negative对应的按下则获得负值(这个值可能不是严格的正负1,而是一个很接近正负1的数)。

所以,我们只要把刚才代码中1的位置,换成Input的值就可以了。获取Input的方法是Input.GetAxis(String AxisName)函数,AxisName就是轴的名称,也就是Horizontal和Vertical。为了能控制移动的速度,我们再额外乘一个可调的变量speed。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { [SerializeField] private float _speed; void Update() { float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); this.transform.Translate(new Vector3(horizontalInput * _speed * Time.deltaTime , verticalInput * _speed * Time.deltaTime, 0)); } }

Tips:private和protected变量在Inspector面板上是不可见的,但[SerializeField] 可以让接下来一行声明的变量强制显示出来。如果我们有一些应该是private型的变量,但在开发过程中又希望能显示在面板上便于调整,则可以使用这个方法。

我们在面板上把speed调到合适的大小,大概5左右。现在物体就可以在键盘wasd的控制下正常地移动了。

在下一节,我们通过一个"吃掉"道具的例子来看如何处理基本的碰撞事件。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3