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

Unity 2D玩家移动控制:三种实现方法详解

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

Unity 2D玩家移动控制:三种实现方法详解

引用
1
来源
1.
https://www.cnblogs.com/iiismobi/p/18317243

在Unity中实现2D玩家移动是游戏开发的基础技能之一。本文将介绍三种不同的方法来控制玩家角色的移动,适合初学者学习和参考。

介绍

首先,创建一个简单的场景,包含一个粉色圆形精灵贴图作为玩家(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);
}

方法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();
    // 这种方法由于物体有惯性,停止移动按键后没有办法立刻停止移动,可以将getaxis函数改为GetAxisRow函数,见方法三
    playerPosition.position += playerVector * playerSpeed * Time.deltaTime;
}

方法3:使用GetAxisRaw

第三种方法使用GetAxisRaw函数,与GetAxis函数的主要区别在于返回值的范围和行为:

  • input.GetAxis()的返回值是[-1, 1],具有平滑过渡功能
  • input.GetAxisRaw()的返回值是[-1, 0, 1]

使用GetAxisRaw可以让玩家在松开按键时立即停止移动。

// 第三种方法
private Vector3 ManagerPlayMove3()
{
    // 获取玩家输入
    float moveX = Input.GetAxisRaw("Horizontal"); // 变为GetAxisRaw
    float moveY = Input.GetAxisRaw("Vertical"); // 变为GetAxisRaw
    return new Vector3(moveX, moveY, 0).normalized;
}

void Update()
{
    // 使用第三种方法
    playerVector = ManagerPlayMove3();
    playerPosition.position += playerVector * playerSpeed * Time.deltaTime;
}

总结

以上三种方法各有特点,可以根据具体需求选择合适的实现方式。此外,Unity还提供了Input System这一更强大的输入处理系统,可以进一步提升输入处理的灵活性和性能。对于更高级的输入处理需求,建议参考相关教程和文档进行深入学习。

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