[Chip]Unity开发笔记--射线检测实现爬墙与蹬墙跑

本文介绍了如何在Unity游戏中实现玩家角色的墙面碰撞检测和移动功能,包括使用射线检测判断左右两侧及前方是否有墙,以及爬墙和蹬墙跑的代码编写和控制逻辑。

1.射线配置

射线检测Player的正面,左面,右面是否有层级为Wall的物体并返回

bool inRightWall;
bool inLeftWall;
bool inFaceWall;
float wallCheckSize;
LayerMask wall;
RaycastHit leftHit;
RaycastHit rightHit;
RaycastHit FaceHit;
private void WallCheck()
    {
        inRightWall = Physics.Raycast(transform.position, transform.right, out rightHit, wallCheckSize, wall);
        inLeftWall = Physics.Raycast(transform.position, -transform.right, out leftHit, wallCheckSize, wall);
        inFaceWall = Physics.Raycast(transform.position, transform.forward, out FaceHit, wallCheckSize, wall);
    }

2.爬墙代码编写

1.Vector3 moveVector的配置在移动相关的笔记有做介绍

Rigidbody rb;
Vector3 moveVector;
public float climbForce;
private void Start()
    {
        rb=player.GetComponent<Rigidbody>();
    }
private void Update()
    {
        if (moveVector.z>0&&inFaceWall)
        {
            rb.velocity = new Vector3(0,climbForce,0);
            //面向墙体时继续按住前进键即可获得一个向上的力,模拟爬墙
        }
    }

2.设置好climbForce保存后运行即可在面向墙时向上攀爬。

3.蹬墙跑代码编写

1.检测左面或者右面有墙,且持续按下前进键,将状态设置为正在蹬墙跑

Vector3 wallNormal;
Vector3 wallForward;
bool isWallRun;
private void Start()
    {
        isWallRun=false;
    }
private void Update()
    {
        WallRunState();
    }
private void WallRunState()
    {
        if ((inLeftWall || inRightWall) && inputVector.y != 0 )
        {
            if (isWallRun)
            {
                isWallRun = true;
                rb.useGravity = false;
            }
        }
        else
        {
            if (isWallRun)
            {
                StopWallRun();
                //该函数在后面会有介绍
            }
        }
    }

2.当正在蹬墙跑时

public float wallRunForce;
private void FixedUpdate()
    {
        if (isWallRun)
        {
            WallRunMovement();
        }
    }
private void WallRunMovement()
    {
        rb.velocity = new Vector3(rb.velocity.x, 0, rb.velocity.z);
        //在前面的设置中已经取消了Player的重力,将垂直方向的速度设为0即可在空中不落下
        wallNormal = inRightWall ? leftHit.normal : rightHit.normal;
        //三目运算符,如果右面有墙则返回右墙的法向量,否则返回左墙的法向量
        wallForward = Vector3.Cross(wallNormal, player.transform.up);
        //叉乘确定前进方向
        rb.AddForce(wallForward*wallRunForce,ForceMode.Force);
        //为Player施加力使得Player能持续向前跑
    }

3.结束蹬墙跑

private void StopWallRun()
    {
        isWallRun= false;
        rb.useGravity=true;
        //恢复重力
    }

4.设置好wallRunForce保存后运行即可在靠近墙时进行蹬墙跑。

4.完整项目视频预览

[Unity练习作]类幽灵行者跑酷小游戏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值