当前位置: 首页 > news >正文

Unity小功能 - 贴墙滑行

目录

一. 简介

二. 创建项目

1.新建地板

2.创建墙体

3.创建主角

三. 编写代码

四. 效果演示

五. 总结



一. 简介

贴墙滑行是在游戏中常见的一种角色动作表现,它能够增加游戏的真实感和趣味性,同时也为游戏玩法带来更多的可能性。

在 Unity 中实现贴墙滑行功能,主要涉及到物理检测、速度控制和动画配合等方面。

物理检测
通常使用射线检测(Raycast)来判断角色是否与墙壁接触。从角色的侧面发射射线,如果射线与特定的墙层(通过 LayerMask 定义)发生碰撞,就认为角色贴墙了。

速度控制
当检测到贴墙且角色在竖直方向上有向下的速度时,需要控制其竖直方向的速度。可以设置一个固定的下滑速度,或者根据一些条件动态调整下滑速度,比如根据角色的重量、墙壁的材质等。

动画配合
为了让贴墙滑行的表现更加自然,需要切换到相应的动画。可以通过动画控制器(Animator Controller)根据角色的状态(是否贴墙滑行)来触发合适的动画。

优化和调整
在实际开发中,可能需要对贴墙滑行的效果进行多次优化和调整。例如,调整射线检测的长度和频率,以确保检测的准确性和性能;优化速度控制的算法,避免出现不自然的卡顿或跳跃;调整动画的过渡效果,使动画之间的切换更加平滑。

应用场景
贴墙滑行功能常见于平台跳跃类、动作冒险类游戏中。比如,角色在攀爬高楼时,可以从墙壁上安全地滑下;在穿越狭窄的通道时,利用贴墙滑行来快速通过。

通过精心实现贴墙滑行功能,可以为游戏增添丰富的操作体验,提升游戏的品质和吸引力

二. 创建项目

1.新建地板

做一下拉伸

2.创建墙体

也做一下拉伸,改一下位置.

并且把标签改为 wall.方便后面做判定.

3.创建主角

加上刚体组件

三. 编写代码

首先获取刚体组件

    private Rigidbody rb;// Start is called before the first frame updatevoid 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 updatevoid Start(){rb = GetComponent<Rigidbody>();}// Update is called once per framevoid 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),准确识别碰撞体是否为墙壁。

进入墙壁时改变重力
当检测到角色首次与墙壁发生接触(进入贴墙状态)时,修改重力相关的参数。例如,减小重力的影响,使角色能够更顺畅地贴墙滑行。

离开墙壁时恢复重力
持续检测角色与墙壁的接触状态。当角色离开墙壁时,将重力恢复到默认值或初始设定值,以确保角色在正常环境中的运动符合预期。

在实际开发中,还需要考虑诸如检测的准确性、性能优化、与其他游戏逻辑的兼容性等问题。


http://www.mrgr.cn/news/1481.html

相关文章:

  • 【游戏开发】【Unity】如何快速建造人物模型并赋予动画动作
  • 基于Python的二手车爬虫及价格预测可视化研究【多种机器学习对比研究】
  • 力扣热题100_回溯_39_组合总和
  • 全球首批后量子加密标准诞生
  • 领夹麦克风哪个牌子好?一文揭秘直播用什么领夹麦比较好
  • 测试流程自动化实践!
  • retinaface在ubuntu20.04(wsl2)下使用tensorrt(c++)部署
  • 【TCP】核心机制:延时应答、捎带应答和面向字节流
  • Public Key Cryptography文章分类总结( PKC 2020)
  • 对变量说“定”的猴王
  • Nuclei文件上传小Tips
  • 【Java 并发编程】(二) 从对象内存布局开始聊 synchronized
  • C语言之“ 数组 ”
  • UGUI使用IPointerDownHandler接口时要注意的一个小事项。
  • Selenium实战:深度解析Python中嵌套Frame与iFrame的定位与切换技巧,解决Selenium定位不到的问题
  • Datawhale X 魔搭 AI夏令营第四期-魔搭生图task3学习笔记
  • Android笔试面试题AI答之Kotlin(13)
  • Spring MVC中获取请求参数的方式
  • xcode 15如何使用Github的包
  • 素数筛(欧拉筛)