问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity 2D游戏开发:三种玩家移动控制方法详解

创作时间:
作者:
@小白创作中心

Unity 2D游戏开发:三种玩家移动控制方法详解

引用
CSDN
1.
https://blog.csdn.net/QA154/article/details/140561390

本文是作者学习Unity 2D游戏开发时的笔记,详细记录了三种控制玩家移动的方法。虽然文章是个人学习记录,但内容完整且实用,适合Unity初学者参考学习。

介绍

在Unity中实现玩家移动是游戏开发的基础。本文将介绍三种不同的方法来控制玩家移动。首先,创建一个简单的场景:一个粉色的圆形精灵作为玩家(player),黄色矩形作为墙壁(wall)。

创建一个名为PlayerMoving的脚本,并将其挂载到player对象上。脚本中需要定义以下变量:

  • playerPosition:玩家的位置
  • playerSpeed:玩家移动速度
  • playerVector:玩家移动方向
public Transform playerPosition;
public float playerSpeed;
public Vector3 playerVector;

// 给变量赋值
void Start()
{
    playerSpeed = 5.0f;
    playerVector = new Vector3(0, 0, 0);
}

将场景中的player对象拖到PlayerMoving脚本中。

方法1:直接按键控制

第一种方法是通过检测WASD或箭头键的输入来控制玩家移动。

private Vector3 ManagerPlayMove1()
{
    Vector3 temp = new Vector3(0, 0, 0);
    if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
    {
        temp.y += 1; // 向上移动
    }
    if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
    {
        temp.x += 1; // 向右移动
    }
    if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
    {
        temp.y -= 1; // 向下移动
    }
    if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
    {
        temp.x -= 1; // 向左移动
    }
    return temp.normalized; // 归一化向量temp,使移动效果更顺滑
}

void Update()
{
    playerVector = ManagerPlayMove1();
    playerPosition.position += playerVector * playerSpeed * Time.deltaTime;
}

方法2:使用Input Manager

第二种方法使用Unity的Input Manager,可以简化代码,不需要单独处理每个按键。

private Vector3 ManagerPlayMove2()
{
    float moveX = Input.GetAxis("Horizontal"); // 水平方向移动
    float moveY = Input.GetAxis("Vertical"); // 竖直方向移动
    return new Vector3(moveX, moveY, 0).normalized;
}

void Update()
{
    playerVector = ManagerPlayMove2();
    playerPosition.position += playerVector * playerSpeed * Time.deltaTime;
}

方法3:使用GetAxisRaw

第三种方法使用GetAxisRaw函数,可以实现按键松开后立即停止移动的效果。

private Vector3 ManagerPlayMove3()
{
    float moveX = Input.GetAxisRaw("Horizontal");
    float moveY = Input.GetAxisRaw("Vertical");
    return new Vector3(moveX, moveY, 0).normalized;
}

void Update()
{
    playerVector = ManagerPlayMove3();
    playerPosition.position += playerVector * playerSpeed * Time.deltaTime;
}

总结

  • Input.GetAxis()返回值范围是[-1, 1],具有平滑过渡功能
  • Input.GetAxisRaw()返回值是{-1,0,1},没有平滑过渡

可以根据具体需求选择不同的方法。此外,Unity的Input System功能更强大,可以进一步探索学习。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号