Unity-控制2D物体移动

Posted 小狐狸FM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity-控制2D物体移动相关的知识,希望对你有一定的参考价值。

前言

通过修改2D物体的位置和图片达到移动的效果,素材来自爱给网
写一下笔记方便记忆,如果有出现错误可在下发评论告知。

在这里插入图片描述

Unity版本: 2019.4.26
Visual Studio版本: 2019

相关介绍

unity3d输入与控制——键盘事件

Unity3D InputManager官方介绍(英文)

Unity3D InputManager官方介绍(中文)

transform.Translate方法-游戏蛮牛

Time.deltaTime 增量时间-游戏蛮牛

其他介绍

微软官方C#函数文档

Unity官方API文档(英文)

Unity官方API文档(中文)

Unity官方用户手册(中文)

Unity游戏蛮牛API文档(中文)

Unity教程-C语言中文网

Unity用户手册-unity圣典

Unity组件手册-unity圣典

Unity脚本手册-unity圣典

上一篇笔记

Unity(6)-通过脚本修改图片sprite

下一篇笔记

Unity(8)-开启或关闭背景音乐

一、项目结构

在这里插入图片描述

二、水平轴和垂直轴

在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]. 图片切换

在这里插入图片描述
在这里插入图片描述

	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物体移动的主要内容,如果未能解决你的问题,请参考以下文章

Unity2D中使用鼠标拖动物体移动

unity2D如何动态改变物体的layer

unity3d 2D平面游戏实现鼠标拖拽物体移动

Unity 2D物体移动

unity3d用键盘控制物体移动的工具

2D 对象碰撞 Unity