目录
一. 简介
贴墙滑行是在游戏中常见的一种角色动作表现,它能够增加游戏的真实感和趣味性,同时也为游戏玩法带来更多的可能性。
在 Unity 中实现贴墙滑行功能,主要涉及到物理检测、速度控制和动画配合等方面。
物理检测:
通常使用射线检测(Raycast)来判断角色是否与墙壁接触。从角色的侧面发射射线,如果射线与特定的墙层(通过 LayerMask
定义)发生碰撞,就认为角色贴墙了。
速度控制:
当检测到贴墙且角色在竖直方向上有向下的速度时,需要控制其竖直方向的速度。可以设置一个固定的下滑速度,或者根据一些条件动态调整下滑速度,比如根据角色的重量、墙壁的材质等。
动画配合:
为了让贴墙滑行的表现更加自然,需要切换到相应的动画。可以通过动画控制器(Animator Controller)根据角色的状态(是否贴墙滑行)来触发合适的动画。
优化和调整:
在实际开发中,可能需要对贴墙滑行的效果进行多次优化和调整。例如,调整射线检测的长度和频率,以确保检测的准确性和性能;优化速度控制的算法,避免出现不自然的卡顿或跳跃;调整动画的过渡效果,使动画之间的切换更加平滑。
应用场景:
贴墙滑行功能常见于平台跳跃类、动作冒险类游戏中。比如,角色在攀爬高楼时,可以从墙壁上安全地滑下;在穿越狭窄的通道时,利用贴墙滑行来快速通过。
通过精心实现贴墙滑行功能,可以为游戏增添丰富的操作体验,提升游戏的品质和吸引力
二. 创建项目
1.新建地板
做一下拉伸
2.创建墙体
也做一下拉伸,改一下位置.
并且把标签改为 wall.方便后面做判定.
3.创建主角
加上刚体组件
三. 编写代码
首先获取刚体组件
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
}
然后获取键盘输入,
if (Input.GetKey(KeyCode.A))
{
rb.AddForce(Vector3.forward*Time.deltaTime* Speed, ForceMode.Impulse);
}
if (Input.GetKey(KeyCode.D))
{
rb.AddForce(Vector3.back * Time.deltaTime * Speed, ForceMode.Impulse);
}
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * Time.deltaTime * Jump, ForceMode.Impulse);
}
在判断物体是否接触和离开
private void OnCollisionEnter(Collision collision)
{
if (collision.transform.CompareTag("wall")) {
Physics.gravity = new Vector3(0f, -1f, 0f); // 修改全局重力大小为 -1
}
}
private void OnCollisionExit(Collision collision)
{
if (collision.transform.CompareTag("wall"))
{
Physics.gravity = new Vector3(0f, -9.81f, 0f); // 修改全局重力大小为 -9.81
}
}
完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCon : MonoBehaviour
{
public float Speed;
public float Jump;
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
if (rb != null)
{
if (Input.GetKey(KeyCode.A))
{
rb.AddForce(Vector3.forward*Time.deltaTime* Speed, ForceMode.Impulse);
}
if (Input.GetKey(KeyCode.D))
{
rb.AddForce(Vector3.back * Time.deltaTime * Speed, ForceMode.Impulse);
}
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * Time.deltaTime * Jump, ForceMode.Impulse);
}
}
}
private void OnCollisionEnter(Collision collision)
{
if (collision.transform.CompareTag("wall")) {
Physics.gravity = new Vector3(0f, -1f, 0f); // 修改全局重力大小为 -1
}
}
private void OnCollisionExit(Collision collision)
{
if (collision.transform.CompareTag("wall"))
{
Physics.gravity = new Vector3(0f, -9.81f, 0f); // 修改全局重力大小为 -9.81
}
}
}
四. 效果演示
GIF演示
五. 总结
在 Unity 中实现 “贴墙滑行” 这一小功能,并在进入和离开墙壁时改变重力,主要包含以下关键要点:
碰撞体检测:
使用射线检测或其他碰撞检测方法来判断角色与碰撞体的接触。通过定义特定的 “墙” 层(LayerMask
),准确识别碰撞体是否为墙壁。
进入墙壁时改变重力:
当检测到角色首次与墙壁发生接触(进入贴墙状态)时,修改重力相关的参数。例如,减小重力的影响,使角色能够更顺畅地贴墙滑行。
离开墙壁时恢复重力:
持续检测角色与墙壁的接触状态。当角色离开墙壁时,将重力恢复到默认值或初始设定值,以确保角色在正常环境中的运动符合预期。
在实际开发中,还需要考虑诸如检测的准确性、性能优化、与其他游戏逻辑的兼容性等问题。