在unity2D中实现角色移动及跳跃

       

目录

1.创建项目

2.创建玩家角色以及相关场景

​编辑

3.代码部分


在unity2D项目中,想要制作平台跳跃类的游戏,肯定少不了角色的控制系统,在本片文章中将带领大家尝试实现2D玩家角色的移动及跳跃。

1.创建项目

正常创建一个2D或者URP2D的项目,将其命名为PlayerController

2.创建玩家角色以及相关场景

给玩家挂载身体的碰撞器以及刚体,这里将刚体挂在玩家身体精灵的父物体上,后面也会将代码挂在父物体上,目的是让父物体移动然后带动玩家移动。(记得将刚体的Z轴冻结,否则可能出现玩家的精灵翻倒的情况。)

同时创建一个正方体并将其拉长,挂载一个盒状的碰撞箱,充当地面。

3.代码部分

创建一个C#代码(BisicController),将其挂在Player下。

以下是代码部分:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BisicController : MonoBehaviour
{
    private Rigidbody2D playerRigidBody;
    public float moveSpeed;
    public float jumpSpeed;

    void Start()//在start函数中,会在游戏开始运行时调用一次其中的代码
    {
        playerRigidBody = GetComponent<Rigidbody2D>();//获取玩家的刚体
    }

    void Update()//在update函数中,每帧都会调用一次其中的代码
    {
        Move();
        Jump();
    }
    void Move()//玩家移动的函数
    {
        //通过unity中Input输入的GetAxis函数来确定玩家移动的方向,并将其作为参数赋值给玩家x方向的向量,并令y方向的向量保持不变
        playerRigidBody.velocity = new Vector2(Input.GetAxis("Horizontal") * moveSpeed, playerRigidBody.velocity.y);
    }
    void Jump()//玩家跳跃的函数
    {
        if(Input.GetKeyDown(KeyCode.K))//利用unity中Input输入的GetKeyDown函数检测是否“K“键被按下
        {
            //和玩家移动一样,给玩家y方向的向量赋值
            playerRigidBody.velocity = new Vector2(playerRigidBody.velocity.x, jumpSpeed);
        }
    }
}

控制玩家移动的主要思路就是利用玩家刚体下的velocity并给其赋值,若在只X方向移动便将其他方向赋值为其本来的向量大小。

玩家跳跃同理,检测跳跃按键是否被按下,然后给velocity赋值。

注:

给输入设置键位可以在编辑器左上角的Edit中找到ProjecSettings..,在InputManager的Axis中修改

最后运行游戏就可以通过键盘输入来控制玩家移动了。

<think>我们正在讨论Unity角色移动和碰撞检测的实现。根据用户提供的引用,特别是引用[1]和[2],我们知道这涉及到动作游戏中角色交互的关键部分。同时引用[3]提到碰撞检测需要两个物体都有碰撞器且其中一个有刚体(在2D中则是2D碰撞盒和2D刚体)。 用户的问题:如何在Unity实现角色移动和碰撞检测? 我们将分为两部分:角色移动和碰撞检测。 角色移动:通常使用Transform组件改变位置,或者使用物理引擎(Rigidbody)来移动。这里我们根据引用[1]和[2]的上下文,说明两种常见方法(Transform和Rigidbody)并指出使用物理引擎更有利于碰撞检测。 碰撞检测:需要给角色和障碍物添加碰撞器(Collider),并且角色(或障碍物)需要附加刚体(Rigidbody)组件。然后通过编写脚本来处理碰撞事件。 步骤: 1. 创建角色(GameObject)并添加必要的组件(如Sprite Renderer,Collider,Rigidbody)。 2. 编写移动脚本(使用键盘输入控制移动)。 3. 设置碰撞层(Layer)和标签(Tag)以便于区分不同的碰撞对象。 4. 在脚本中实现碰撞检测的回调函数(如OnCollisionEnter, OnTriggerEnter)。 我们将提供两种移动方式的示例代码: a. 使用Transform直接修改位置(适用于简单的非物理移动) b. 使用Rigidbody施加力或修改速度(适用于需要物理反馈的移动) 同时,注意引用[3]中提到的:2D碰撞需要2D的碰撞盒和刚体。 因此,我们将以2D为例(3D同理,组件名称去掉2D即可)。 最后,生成相关问题。 注意:引用标识的使用。我们引用了用户提供的引用[1][2][3],在适当的地方标注。 开始回答:</think>### Unity 角色移动与碰撞检测实现指南 在 Unity实现角色移动和碰撞检测需结合物理系统与脚本控制。以下是详细步骤(以 2D 为例,3D 原理相同): --- #### **步骤 1:基础组件设置** 1. **角色添加物理组件** - 为角色 GameObject 添加: - `Rigidbody 2D`(启用重力控制物理行为) - `Collider 2D`(如 Box Collider 2D 或 Circle Collider 2D,定义碰撞边界)[^3] - 在 Inspector 中调整刚体属性: - `Mass`(质量):控制惯性,建议 0.5~1 - `Gravity Scale`:0 表示无重力(平台跳跃类游戏常用) 2. **环境物体设置** - 所有平台/障碍物需添加 `Collider 2D`(无需 Rigidbody) - 使用 **Layer** 分层管理碰撞(如 Player/Enemy/Ground 层) --- #### **步骤 2:角色移动实现** ```csharp using UnityEngine; public class PlayerMovement : MonoBehaviour { [SerializeField] private float moveSpeed = 5f; private Rigidbody2D rb; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { // 键盘输入获取 float horizontalInput = Input.GetAxis("Horizontal"); // 移动控制(保持物理交互) Vector2 movement = new Vector2(horizontalInput * moveSpeed, rb.velocity.y); rb.velocity = movement; } } ``` > **关键点**: > - 通过 `Rigidbody.velocity` 移动而非直接修改 `Transform.position`,确保碰撞物理生效[^2] > - 若需跳跃,添加 `rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);` --- #### **步骤 3:碰撞检测实现** ```csharp void OnCollisionEnter2D(Collision2D collision) { // 检测与特定层的碰撞 if (collision.gameObject.layer == LayerMask.NameToLayer("Enemy")) { Debug.Log("Hit Enemy!"); Destroy(collision.gameObject); // 示例:销毁敌人 } } // 触发器检测(需勾选Collider的"Is Trigger") void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Coin")) { Destroy(other.gameObject); // 拾取硬币 } } ``` > **关键点**: > - `OnCollisionEnter2D`:处理物理碰撞(如角色撞击墙壁) > - `OnTriggerEnter2D`:处理穿透型交互(如拾取道具)[^1] --- #### **步骤 4:常见问题解决** - **角色穿墙**: - 确保所有碰撞体尺寸匹配视觉 - 在 Rigidbody 2D 中启用 `Collision Detection > Continuous` - **移动卡顿**: - 避免在 `Update()` 中实例化对象 - 使用 `FixedUpdate()` 处理物理计算 --- #### **物理公式参考** 移动时速度与力的关系: $$ \vec{v} = \vec{v_0} + \vec{a} \cdot t $$ 其中 $\vec{v}$ 为当前速度,$\vec{v_0}$ 为初速度,$\vec{a}$ 为加速度(由力 $F$ 和质量 $m$ 决定:$a = F/m$)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值