Unity-控制2D物体移动
Posted 小狐狸FM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity-控制2D物体移动相关的知识,希望对你有一定的参考价值。
前言
通过修改2D物体的位置和图片达到移动的效果,素材来自爱给网
写一下笔记方便记忆,如果有出现错误可在下发评论告知。
Unity版本: 2019.4.26
Visual Studio版本: 2019
相关介绍
其他介绍
上一篇笔记
下一篇笔记
一、项目结构
二、水平轴和垂直轴
在2D的场景中,可以将其分为水平和垂直两个轴
之后我们就需要通过获取这两个轴向的键盘输入来实现移动2D物体
水平轴:Horizontal
垂直轴:Vertical
要是不记得这两者的英文名称可以去翻译一下,也可以在
Project Setting
设置中查看Input Manager
如果我们需要添加新的轴时,可以通过修改
Size
值实现
添加了新的轴,就会在下方添加名为
Cancel
的轴
修改
Name
参数的时候会让下三角右侧的名称发生变动
下方表格内容来自Unity官方中文手册,Unity3D InputManager官方介绍(中文)
属性 | 功能 |
---|---|
Name | 轴名称,使用此名称可以通过脚本来访问轴。 |
Descriptive Name, Descriptive Negative Name | 这些值已弃用,不起作用。以前在启动时会在 Rebind Controls 屏幕上为用户显示这些值,但该屏幕也已弃用。 |
Negative Button, Positive Button | 用于分别沿负向和正向推动轴的控件。这些控件可以是键盘上的键,也可以是游戏杆或鼠标上的按钮。 |
Alt Negative Button, Alt Positive Button | 用于分别沿负向和正向推动轴的备用控件。 |
Gravity | 不存在输入时,轴下降到中性点的速度(以单位/秒表示)。 |
Dead | 在应用程序对移动操作进行记录之前,用户需要移动模拟摇杆的距离。在运行时,所有模拟设备在该范围内的输入将被视为 null。 |
Sensitivity | 轴向目标值移动的速度(以单位/秒表示)。仅用于数字设备。 |
Snap | 如果启用此属性,按下对应于反方向的按钮时,轴值将重置为零。 |
Type | 这是控制此轴的输入类型。从以下值中进行选择: 键或鼠标按钮 (Key or Mouse button)、 鼠标移动 (Mouse Movement)、游戏杆轴 (Joystick Axis) |
Axis | 这是用于控制此轴的连接设备的轴。 |
JoyNum | 这是控制此轴的连接游戏杆。可以选择特定游戏杆,或查询所有游戏杆的输入。 |
二、脚本
[1]. 获取键盘输入
- 当我们按下
D
或→
时,Input.GetAxis("Horizontal")
会返回正值;当按下A
或←
时会返回负值;不按就返回0
- 当按下
W
或↑
时,Input.GetAxis("Vertical")
返回正值;当按下S
或↓
时返回负值;不按返回0
- 获取水平轴输入:
Input.GetAxis("Horizontal")
获取垂直轴输入:Input.GetAxis("Vertical")
void Update()
{
float x = Input.GetAxis("Horizontal");//获取水平轴输入
float y = Input.GetAxis("Vertical");//获取垂直轴输入
}
[2]. 移动
移动需要使用到
transform.Translate
方法,该方法需要传入2
个参数
第一个为Vector3
三维向量信息(与x
轴、y
轴、z
轴坐标有关)和参考坐标系对于
2D
的物体来说,z
轴是不需要的第一个参数的格式为:
方向 * 速度 * 时间增量
传入与时间有关的参数
Time.deltaTime
,表示每秒
运行指定的距离
不填写Time.deltaTime
时会每帧
运行指定的距离,容易导致错误
- 参考坐标系有两种,世界坐标系和自身坐标系
世界坐标系:Space.World
自身坐标系:Space.Self
- 通过
Input.GetAxis("Horizontal")
和Input.GetAxis("Vertical")
就可以来控制方向,
Vector3.right * 数值
中,数值
为正值时表示向右,为负值时表示向左;
Vector3.up * 数值
中,数值
为正值时表示向上,为负值时表示向下。
变量 | 介绍 |
---|---|
Vector.right | 在世界空间坐标变换的红色轴,即x轴正方向 |
Vector.up | 在世界空间坐标变换的绿色轴,即y轴正方向 |
Vector.forward | 在世界空间坐标变化的蓝色轴,即z轴正方向 |
void Update()
{
float x = Input.GetAxis("Horizontal");//获取水平轴输入
float y = Input.GetAxis("Vertical");//获取垂直轴输入
transform.Translate(Vector3.right * x * moveSpeed * Time.deltaTime,Space.World);//水平移动,x为正向右,x为负向左
transform.Translate(Vector3.up * y * moveSpeed * Time.deltaTime,Space.World);//垂直移动,y为正向上,y为负向下
}
[3]. 方向判断
- 当我们按下
D
或→
时,Input.GetAxis("Horizontal")
会返回正值;当按下A
或←
时会返回负值;不按就返回0
- 当按下
W
或↑
时,Input.GetAxis("Vertical")
返回正值;当按下S
或↓
时返回负值;不按返回0
void Update()
{
float x = Input.GetAxis("Horizontal");//获取水平轴输入
float y = Input.GetAxis("Vertical");//获取垂直轴输入
transform.Translate(Vector3.right * x * moveSpeed * Time.deltaTime, Space.World);//水平移动,x为正向右,x为负向左
transform.Translate(Vector3.up * y * moveSpeed * Time.deltaTime, Space.World);//垂直移动,y为正向上,y为负向下
if (x > 0)//向右移动
{
}
else if (x < 0)//向左移动
{
}
else if (y > 0)//向上移动
{
}
else if (y < 0)//向下移动
{
}
}
[4]. 图片切换
- 你可以根据下方的文章来学习图片切换的内容,此篇文章不再介绍
Unity(6)-通过脚本修改图片sprite- 引用时还需要注意图片在
Sprite
数组中的下标
void Update()
{
float x = Input.GetAxis("Horizontal");//获取水平轴输入
float y = Input.GetAxis("Vertical");//获取垂直轴输入
transform.Translate(Vector3.right * x * moveSpeed * Time.deltaTime, Space.World);//水平移动,x为正向右,x为负向左
transform.Translate(Vector3.up * y * moveSpeed * Time.deltaTime, Space.World);//垂直移动,y为正向上,y为负向下
if (x > 0)//向右移动
{
sr.sprite = pic[1];
}
else if (x < 0)//向左移动
{
sr.sprite = pic[2];
}
else if (y > 0)//向上移动
{
sr.sprite = pic[3];
}
else if (y < 0)//向下移动
{
sr.sprite = pic[0];
}
}
[5]. 全部代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
//属性值
public float moveSpeed = 2;//移动速度
//引用
public Sprite[] pic;//图片
private SpriteRenderer sr;//组件
void Start()
{
sr = GetComponent<SpriteRenderer>();//获取该物体的SpriteRendderer组件
}
void Update()
{
float x = Input.GetAxis("Horizontal");//获取水平轴输入
float y = Input.GetAxis("Vertical");//获取垂直轴输入
transform.Translate(Vector3.right * x * moveSpeed * Time.deltaTime, Space.World);//水平移动,x为正向右,x为负向左
transform.Translate(Vector3.up * y * moveSpeed * Time.deltaTime, Space.World);//垂直移动,y为正向上,y为负向下
if (x > 0)//向右移动
{
sr.sprite = pic[1];
}
else if (x < 0)//向左移动
{
sr.sprite = pic[2];
}
else if (y > 0)//向上移动
{
sr.sprite = pic[3];
}
else if (y < 0)//向下移动
{
sr.sprite = pic[0];
}
}
}
以上是关于Unity-控制2D物体移动的主要内容,如果未能解决你的问题,请参考以下文章