unity2D 人物移动和跳跃

文章介绍了如何在Unity2D中创建游戏角色,包括设置动画、编写PlayerMovement脚本,涉及碰撞检测、地面接触判断、角色移动和跳跃功能的实现,以及精灵的朝向翻转。通过Input.GetAxisRaw处理键盘输入,FixedUpdate用于处理物理运动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础的unity2D游戏角色创建:

最初始的是动画设置。

其次就是脚本创建:

1、playermovement(script)

首先我们要知道的几点是:创建2D角色我们要有一个与地面的接触点,来判断是否与地面接触,这样我们就分为两种情况:1、与地面接触接触的情况.2、不与地面接触的情况:

        公共属性和私有属性前期准备:

    private Rigidbody2D mybody;
    public float speed=5f;//角色移动的速度
    Animator anim;//创建声明游戏角色

    public Transform groundeCheckPosition;//获取物体三位
    public  LayerMask goundeplayer;
    private bool isGrounded;//检查是否与地面发生碰撞
    public float jumpPower=5f;
    private bool jumped;

检测点的创建:通过创建空对象在脚底下创建检测点

 

在update函数中添加代码(update函数:每帧检测)

void update()
{
    CheckIfgrounded();
    PlayerJump();
}

checkIfGrounded()函数的实现:

起始位置groundedcheckposition向下发射射线,距离为0.1,检测图层为groundeplayer,如果是gourndeplayer图层则返回bool值true。

判断是在地面上,如果在,再判断是否是跳跃状态,如果是则不能再次跳跃,然后设置jump动画的bool值为false

private void CheckIfGrounded(){

IsGournded=Physics2D.Raycast(GroundeCheckPostion,vector.down,0.1f,gourdeplayer);

 if (isGrounded) {
            if (jumped) {
                jumped = false;
                anim.SetBool("jump", false);
            
            }

        
        }

}

角色移动函数:

FIxedupdate函数每帧都别调用,与update的区别在于Fixupdate是真实的物理时间真,而update是游戏时间帧,因此一般使用FixUpdate处理有物理刚体的物体Rigboy

  private void FixedUpdate()
    {
         playerWalk();
    }

 unity2D游戏通过键盘的上下左右键来控制物体移动

InPut.GetAxisRaw的参数有两个:

1、horizontal水平:左键为-1,右键为1

2、Vertical 垂直:上建为1,下键为-1

private void playerWalk()
    {
        
        //精灵左右移动的速率
        float h = Input.GetAxisRaw("Horizontal");
        if (h > 0)
        {
            mybody.velocity = new Vector2(speed, mybody.velocity.y);
            changeDirection(1);//改变精灵的朝向
        }

角色跳跃:

private void playerJump()//跳跃
    {
        if (isGrounded) { //检查是否与地面发生接触
            if (Input.GetKey(KeyCode.Space)||(Input.GetKey(KeyCode.Space)&&(Input.GetKey(KeyCode.LeftArrow)||Input.GetKey(KeyCode.RightArrow)))) {
                jumped = true;
                mybody.velocity = new Vector2(mybody.velocity.x, jumpPower);
                anim.SetBool("jump", true);
            }
           
            
        }
    }

精灵朝向的翻转:

主要改变的是精灵的locascale:

  private void changeDirection(int v)
    {
        Vector3 s = transform.localScale;
        s.x = v;
        transform.localScale = s;
    }

补充代码:

    private void Awake()//激活
    {
        mybody = GetComponent<Rigidbody2D>();//给mybody一个赋值

        anim = GetComponent<Animator>();
    }

### Unity 2D 中实现角色跳跃Unity 2D 平台游戏中,实现角色跳跃是一个重要的功能。为了使角色能够正常跳跃并检测其是否处于空中或站在地面上,通常会结合物理引擎碰撞检测来完成。 #### 创建项目设置 当开始一个新的 Unity 2D 项目时,确保选择了合适的模板,并配置好场景中的基本元素如摄像机、地面其他必要的游戏对象[^1]。 #### 编写跳跃逻辑 对于简单的单次跳跃或者更复杂的多次跳跃机制,可以通过脚本来管理跳跃行为: - **定义变量** 需要在 `PlayerController` 类中声明一些公共字段以便于调整跳跃属性,比如最大允许的跳跃次数以及当前剩余可使用的跳跃数。 ```csharp public class PlayerController : MonoBehaviour { public int jumpCount = 2; // 设置初始跳跃次数,默认为两次跳跃能力 private bool isGrounded; } ``` - **处理输入** 使用 Update 方法监听用户的按键事件(例如按下空格键),以此触发跳跃动作。同时还需要判断此时是否有足够的跳跃权限可用。 ```csharp void Update() { if (Input.GetKeyDown(KeyCode.Space)) { Jump(); } } private void Jump(){ if (!isGrounded && jumpCount > 0){ rb.velocity = new Vector2(rb.velocity.x, jumpForce); jumpCount--; }else if(isGrounded){ rb.velocity = new Vector2(rb.velocity.x, jumpForce); jumpCount = maxJumps - 1 ;//重置跳跃计数器到最大值减一 } } ``` - **检测着陆情况** 利用 Physics2D.BoxCast 或者其他形式的射线投射技术可以有效地感知玩家是否已经回到了坚实的表面上方。这有助于更新 `isGrounded` 的状态从而影响后续能否继续跳跃。 ```csharp void FixedUpdate(){ RaycastHit2D hitInfo = Physics2D.BoxCast(coll.bounds.center, coll.size, 0f, Vector2.down, .1f, groundLayer); isGrounded = (hitInfo.collider != null); } ``` 上述代码片段展示了如何利用盒形投影来进行地面检测[^3]。 #### 完整示例代码 下面给出的是一个简化版的角色控制器脚本,它包含了上面提到的关键部分: ```csharp using UnityEngine; public class PlayerMovement : MonoBehaviour { Rigidbody2D rb; BoxCollider2D coll; float dirX; [SerializeField] float moveSpeed = 7f; [SerializeField] float jumpForce = 14f; [SerializeField] LayerMask groundLayer; int maxJumps = 2; int jumpCount; bool isGrounded; private void Start() { rb = GetComponent<Rigidbody2D>(); coll = GetComponent<BoxCollider2D>(); jumpCount = maxJumps - 1 ; } private void Update() { HandleHorizontalMovement(); CheckForJumping(); } private void HandleHorizontalMovement(){ dirX = Input.GetAxisRaw("Horizontal"); transform.Translate(dirX * Time.deltaTime * moveSpeed , 0, 0); } private void CheckForJumping(){ if(Input.GetKeyUp(KeyCode.Space)){ Jump(); } } private void Jump(){ if(!isGrounded && jumpCount>0){ rb.velocity = new Vector2(rb.velocity.x,jumpForce); jumpCount--; } else if(isGrounded){ rb.velocity = new Vector2(rb.velocity.x,jumpForce); jumpCount=maxJumps-1; } } private void FixedUpdate(){ var hitInfo = Physics2D.BoxCast(coll.bounds.center,coll.size,0f,Vector2.down,.1f,groundLayer); isGrounded=(hitInfo.collider!=null); } } ``` 此段代码实现了基础的水平移动与垂直方向上的跳跃操作,同时也支持了双击或多级连跳的功能[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值