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保存后运行即可在靠近墙时进行蹬墙跑。
本文介绍了如何在Unity游戏中实现玩家角色的墙面碰撞检测和移动功能,包括使用射线检测判断左右两侧及前方是否有墙,以及爬墙和蹬墙跑的代码编写和控制逻辑。

4236

被折叠的 条评论
为什么被折叠?



