Unity小功能 - 贴墙滑行

news2025/3/12 11:28:38

目录

一. 简介

二. 创建项目

1.新建地板

2.创建墙体

3.创建主角

三. 编写代码

四. 效果演示

五. 总结



一. 简介

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

在 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),准确识别碰撞体是否为墙壁。

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【秋招笔试】8.18大疆秋招(第三套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

测绘程序设计|测绘程序设计大赛介绍|备赛建议

**由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~** 简单介绍测绘学科创新创业智能大赛测绘技能竞赛——测绘程序设计比赛。 &#x1f33f;前言 测绘程序设计比赛是测绘学科创新创…

HTTPS协议和HTTP协议的区别详细图解

文章目录 HTTPS协议加密是什么&#xff1f;对称加密非对称加密 Cookie 和 Session的区别 HTTPS协议 HTTP协议内容都是按照文本的方式明文传输的&#xff0c;是没有经过加密的&#xff0c;没有加密就意味着裸奔&#xff0c;所以协议中的内容就很容易引起一些不良人士的获取和篡…

STM32自制手持小风扇实验

1.1 介绍&#xff1a; 实验功能说明&#xff1a;功能&#xff08;1&#xff09;按一下按键小风扇开启&#xff0c;再按一下关闭。 功能&#xff08;2&#xff09;按一下按键小风扇一档风速&#xff0c;再按一下二挡&#xff0c;依次三挡…关闭。 按键模块说明&#xff1a;按下…

CommandLineRunner

CommandLineRunner 是 Spring Boot 中的一个接口&#xff0c;它允许你在 Spring 应用程序启动之后&#xff08;即在 SpringApplication.run() 执行完成后&#xff09;立即执行一些代码。这在你需要初始化数据、检查配置文件参数或执行其他启动任务时非常有用。 实现 CommandLin…

win10蓝屏CRITICAL_PROCESS_DIED

目录 前言 处理过程 第一阶段处理&#xff1a;重置虚拟内存 第二阶段处理&#xff1a;sfc /scannow 扫描系统并修复损坏文件 前言 连续一周开机一段时间后蓝屏&#xff0c;刚开始的蓝屏提示的是KERNEL_DATA_INPAGE_ERROR&#xff0c;后来经过一番操作&#xff0c;依然出现…

vue使用axios请求后端数据

前后端分离项目的基础&#xff1a; 前后端跨域访问 vite.config.js中加入 // 1.为什么要跨域 //因为浏览器的同源策略,不同站点之间访问需要跨域 //实现跨域的方式&#xff1a;server: {proxy: {// 假设要跨域访问的后端 API 地址以 /api 开头/api: { //表示拦截以/api开头的…

牛客算法小题

目录 牛客.求和​编辑 牛客.abb 牛客.合并k个有序链表 牛客.滑雪&#xff08;暴力->递归->记忆化搜索&#xff09; 牛客.旋转字符串 牛客.求和 我没想到是dfs&#xff0c;另外我的dfs能力确实也不强&#xff0c;另外难度大的是他的那个输出 import java.util.Scanne…

医用氧检测标准:医用氧用什么检怎么检都做了明确规定

新规在《中国药典》2020 年版二部 XGB2021-061条于2022年5月22日实施。 医用氧技术指标&#xff1a;氧≥99.5% 、一氧化碳<0.0005、二氧化碳&#xff1c;0.03%、水分含量&#xff1c;0.0067%&#xff09; 一氧化碳对人体有害&#xff0c;过量的二氧化碳也会影响人的呼吸&a…

2024.8.20 作业

目录 思维导图&#xff1a; 面试题练习&#xff1a; 1、C语言中指针数组和数组指针的区别 2、结构体字节对齐的原理 3、TCP和UDP的区别 4、同步通信和异步通信的区别 5、多线程的理解 6、大小端验证 7、互斥锁 8、共享内存特点 9、C语言的指针 10、gcc编译 11、socket套接字 1…

探索顶级PDF水印API:PDFBlocks(2024年更新)

引言 在一个敏感信息常常面临风险的时代&#xff0c;能够轻松高效地保护文档的能力至关重要。PDF水印已成为企业和个人寻求保护其知识产权、确保文件保密性的基本工具。 PDFBlocks 文字水印 API是什么&#xff1f; PDFBlocks API 提供了一个强大的解决方案&#xff0c;用于在…

轮询系统寻客户

寻找收单客户&#xff0c;不管是源头老板&#xff0c;还是二手中介&#xff0c;不管是PayPal&#xff0c;条纹&#xff0c;还是其他信用卡或轮询系统&#xff0c;只要能收单&#xff0c;都可以免费加入我们。 ​在寻卖单客户&#xff0c;不管是源头订单还是跳转订单&#xff0c…

Redis篇一:初识Redis

文章目录 前言1. 初始Redis2. MySQL VS Redis3. 什么是分布式系统&#xff08;也是一种处理大量数据时的处理方式&#xff09;3.1 单机架构3.2 数据库与应用服务分离3.3 负载均衡3.4 数据库读写分离3.5 引入缓存&#xff08;Redis&#xff09;3.6 数据库分库分表3.7 引入微服务…

如何使用Web Scraper爬虫抓取数据?

Web Scraper是一个基于Chrome/火狐浏览器的插件&#xff0c;能够在网页上自动爬取数据&#xff0c;提供了丰富的配置&#xff0c;支持自动翻页、登录认证、JavaScript渲染等等&#xff0c;可以解决多数爬虫难题。 Web Scraper的安装也很简单&#xff0c;在Chrome应用商店里搜索…

【每日刷题】Day104

【每日刷题】Day104 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 2. 1004. 最大连续1的个数 III…

RabbitMQ环境搭建

2.5.RabbitMQ 安装 a.docker方式安装&#xff1a; 1.在我的docker学习笔记中具有详细的安装过程 b.rpm包方式安装&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令…

机器学习:逻辑回归--下采样

目录 前言 一、为什么使用下采样 1.例如&#xff1a; 2.导致&#xff1a; 3.办法&#xff1a; 4.结果&#xff1a; 二、代码实现 1.完整代码 2.导入库 3.可视化混淆矩阵 4.导入数据 5数据预处理 6.下采样 7.取出训练集和测试集 8.建立模型 9.进行测试 总结 前…

Spring模块详解Ⅰ

目录 SpringSpring框架的主要功能模块1. Core Container&#xff08;核心容器&#xff09;2. Data Access/Integration&#xff08;数据访问与集成&#xff09;3. Web4. AOP (Aspect-Oriented Programming&#xff0c;面向切面编程)5. Instrumentation&#xff08;工具集&#…

CentOS7设置默认免密登录用户root

CentOS7设置默认免密登录用户root 步骤1、打开要更改的 CentOS 系统2、切换到root用户2、reboot重启系统 步骤 1、打开要更改的 CentOS 系统 2、切换到root用户 2、reboot重启系统

前端(Vue)动态换肤的通用解决方案及原理分析(1)

动态换肤原理分析 比如此处将来会实现换肤功能&#xff0c;所以我们不能直接写死&#xff0c;而需要通过一个动态的值进行指定。 <el-menu:default-active"activeMenu":collapse"!$store.getters.sidebarOpened":background-color"$store.getters…