目录
禁用重力:找到 Gravity Scale 属性并将其设置为 0
向左移动人物
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector2 position = transform.position;
position.x = position.x + 0.1f;
transform.position = position;
}
}
Update()每帧调用
上下左右控制物体
使用Unity Input 系统
此处用到Horizontal和Vertical
Input 页面列出所有玩家输入控件(例如,游戏手柄上的一个按键)的 Axes 值。值的范围从 -1 到 1(具体值取决于玩家执行的操作)。
例如,对于游戏手柄上的控制杆,可以将水平轴设置为:
-
-1(控制杆在左侧时)
-
0(控制杆在中间时)
-
1(控制杆在右侧时)
对于键盘按键,以 2 个键来定义轴:
-
负值键,被按下时将轴设置为 -1
-
正值键,被按下时将轴设置为 1
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Debug.Log(vertical);//在 Console 窗口中写入一些内容
Vector2 position = transform.position;
position.x = position.x + 0.1f * horizontal;
position.y = position.y + 0.1f * vertical;
transform.position = position;
/*
* 如果你按向左键,则horizontal将为 -1(即移动距离为 position.x + -0.1f;)。Ruby 将向左移动 -0.1。
如果你按向右键,则horizontal将为 1。Ruby 将向右移动 0.1。
如果没有按下任何键,则horizontal将为 0 且 Ruby 不会移动(0.1 * 0 等于 0)。
*/
}
}
Input系统的键盘输入,例:C按键
if (Input.GetKeyDown(KeyCode.C))
如果要确保在不同设备上有效,可以将 Input.GetButtonDown 与轴名称一起使用(就像前面针对移动执行的操作一样),并在输入设置 (Edit > Project Settings > Input) 中定义该轴对应的按钮。如需了解示例,请查看 Axes > Fire1
修改每秒渲染帧数
也就是调用Update的频率,默认是60帧每秒。
void Start()
{
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 10;//每秒渲染10帧
}
修改后发现物体移动变慢,就有一个问题:
如果一个玩家的计算机非常陈旧,只能以每秒 30 帧的速度运行游戏,而另一个玩家的计算机能以每秒 120 帧的速度运行游戏,那么这两个玩家的主角的移动速度会有很大差异。这样就会使游戏的难易程度提高或降低,具体取决于运行游戏的计算机。
所以前面移动代码应改成
position.x = position.x + 0.1f * horizontal * Time.deltaTime;//乘上每帧渲染时间
position.y = position.y + 0.1f * vertical * Time.deltaTime;
这样不同帧速的电脑控制物体的速度才一样。
Tilemaps瓦片地图
不断重新渲染(Update())很大的游戏世界并不现实,瓦片地图可以用来解决此问题!瓦片地图将世界作为一个网格,你可以在其中为每个网格单元格设置不同的精灵。通过使用在视觉上连在一起的精灵,你可以创建便于在编辑器内直接更改的更大图像。
在 Hierarchy 窗口中创建两个游戏对象:
-
Grid(网格):顾名思义,场景中的网格可用于将游戏对象均匀地放置在网格单元格中。
-
Tilemap(瓦片地图):此瓦片地图是网格的子游戏对象。瓦片地图由瓦片 (Tiles) 组成;在本教程中,可将瓦片视为特殊精灵。
在 Project 窗口中,创建“Tiles”文件夹。选择 Create > Tile。
如果没有就选择 Create > 2D>Tile palette>Rectangular
然后在Hierarchy面板点Layer1,把Sprite拖进去就会生成一个Tile
瓦片集:3x3,比单个瓦片方便
世界设计 - 瓦片地图 - Unity Learn自己看吧受不了了。
物理系统
添加Rigidbody 2D 组件
例1:在刚体上调用 AddForce,施加的力是方向与力的乘积。当力增大时,物理引擎将根据该力和方向逐帧移动飞弹。
rigidbody2d.AddForce(direction * force);
例2:rigidbody2D.simulated = false;//将刚体从物理系统模拟中删除
禁用重力:找到 Gravity Scale 属性并将其设置为 0
碰撞
告诉物理系统,该游戏对象的哪一部分是“实心的”。此操作是通过碰撞体完成的。
碰撞体是简单的形状(例如正方形或圆形),物理系统将这样的形状作为游戏对象的近似形状来进行碰撞计算。
添加Box Collider 2D组件
调整碰撞体大小:单击 Edit Collider 时,碰撞体在 Scene 视图中会变化为在侧面显示四个小方块。可以单击并拖动小方块来调整碰撞体的大小。
但是碰撞时会旋转和抖动
去除旋转
找到 Rigidbody 2D 组件。单击 Constraints 旁边的小箭头以展开该部分。 启用 Freeze Rotation
抖动原因:你不断在箱子内移动物体,而物理系统则将她移回。你要求代码执行的操作与物理系统执行的操作之间的这种冲突就会导致发生抖动。