Unity2D游戏开发-玩家控制
在Unity2D游戏开发中,玩家控制是游戏互动性的核心。本文将解析一个典型的Unity2D玩家控制脚本,探讨如何实现流畅的玩家移动、跳跃和动画切换。以下是一个Unity脚本示例,实现了这些基础功能。
1. 脚本结构
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Playe : MonoBehaviour
{public float moveSpeed = 5.0f; // 角色移动的速度public float jumpForce = 5.0f; // 角色跳跃的力public float doulbjumpForce = 5.0f;//二段跳的力public Animator animator; //动画组件public BoxCollider2D myFeet; //碰撞体积组件public Rigidbody2D rb; // 刚体组件private bool isGrounded; // 角色是否在地面上private bool canDoubleJump;void Start(){// 获取刚体组件//rb = GetComponent<Rigidbody2D>();//myFeet = GetComponent<BoxCollider2D>();}void CheckGround() {//定义获取到的地面isGrounded = myFeet.IsTouchingLayers(LayerMask.GetMask("Ground"));}//用于设置角色的水平翻转,转向方向void Flip(){bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;if (Has){if (rb.velocity.x > 0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);}if (rb.velocity.x < -0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 180, 0);}}}void Update(){Run();Flip();Jump();ainmatorTiao();CheckGround();}void Jump() {// 如果玩家按下空格键并且在地面上,则跳跃if (Input.GetButtonDown("Jump")){if (isGrounded) {//打开名为TiaoYue的动画Bool开关,把状态设置为trueVector2 JumpV = new Vector2(0, jumpForce);rb.velocity = Vector2.up * JumpV;canDoubleJump = true;}elseif (canDoubleJump){Vector2 doubleJump = new Vector2(0.0f, doulbjumpForce);rb.velocity = Vector2.up * doulbjumpForce;canDoubleJump = false; }}}//动画切换void ainmatorTiao(){// 更新动画状态animator.SetBool("DaiJi", !Input.GetButtonDown("Jump")); // 设置待机状态,当没有按下跳跃键时为trueanimator.SetBool("TiaoYue2", false); // 默认情况下,二连跳动画为false// 如果角色在地面上,并且没有按下跳跃键,则设置待机动画if (isGrounded && !Input.GetButtonDown("Jump")){animator.SetBool("TiaoYue", false); // 当角色在地面上且没有按下跳跃键时,关闭跳跃动画}// 如果角色按下跳跃键并且在地面上,则触发第一跳动画else if (Input.GetButtonDown("Jump") && isGrounded){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true); // 触发第一跳动画}// 如果角色在空中并且按下跳跃键,则触发第二跳动画else if (Input.GetButtonDown("Jump") && !isGrounded && !animator.GetBool("TiaoYue2")){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true); // 触发第二跳动画}}void Run() {// 获取水平(AD键)的输入float moverDir = Input.GetAxis("Horizontal");Vector2 playerVel = new Vector2(moverDir * moveSpeed, rb.velocity.y);rb.velocity = playerVel;bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;animator.SetBool("YiDong", Has);}}
2. 移动(Run)功能
在Run方法中,我们根据玩家的输入获取水平方向上的移动速度,并应用这个速度到玩家的Rigidbody2D组件上。同时,我们检查玩家是否在移动,以决定是否播放移动动画。
void Run()
{// 获取水平方向上的输入float moverDir = Input.GetAxis("Horizontal");// 设置玩家的速度Vector2 playerVel = new Vector2(moverDir * moveSpeed, rb.velocity.y);rb.velocity = playerVel;// 检查玩家是否在移动,并设置动画参数bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;animator.SetBool("YiDong", Has);
}
3. 翻转(Flip)功能
Flip方法用于根据玩家的移动方向来翻转玩家的方向。如果玩家向左移动,则角色朝左;如果向右移动,则角色朝右。
void Flip()
{// 检查玩家是否有水平速度bool Has = Mathf.Abs(rb.velocity.x) > Mathf.Epsilon;if (Has){// 根据速度方向翻转角色if (rb.velocity.x > 0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);}if (rb.velocity.x < -0.1f){this.gameObject.transform.localRotation = Quaternion.Euler(0, 180, 0);}}
}
4. 跳跃(Jump)功能
在Jump方法中,我们检查玩家是否按下跳跃键,并根据玩家是否在地面上或是否可以进行双重跳跃来应用跳跃力。
void Jump()
{// 如果玩家按下跳跃键if (Input.GetButtonDown("Jump")){// 如果玩家在地面上,则进行普通跳跃if (isGrounded){Vector2 JumpV = new Vector2(0, jumpForce);rb.velocity = Vector2.up * JumpV;canDoubleJump = true;}// 如果玩家不在地面上但可以进行双重跳跃,则进行双重跳跃else if (canDoubleJump){Vector2 doubleJump = new Vector2(0.0f, doulbjumpForce);rb.velocity = Vector2.up * doulbjumpForce;canDoubleJump = false;}}
}
5. 动画切换(ainmatorTiao)功能
ainmatorTiao方法用于根据玩家的状态来切换玩家的动画。例如,当玩家跳跃时,会播放跳跃动画;当玩家在地面上时,会播放跑步或静止动画。
void ainmatorTiao()
{// 设置动画参数以控制动画的播放animator.SetBool("DaiJi", !Input.GetButtonDown("Jump")); // 设置待机动画animator.SetBool("TiaoYue2", false); // 设置跳跃动画为false// 如果玩家在地面上且没有按下跳跃键,则设置跳跃动画为falseif (isGrounded && !Input.GetButtonDown("Jump")){animator.SetBool("TiaoYue", false);}// 如果玩家按下跳跃键且在地面上,则设置跳跃动画为trueelse if (Input.GetButtonDown("Jump") && isGrounded){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true);}// 如果玩家按下跳跃键且不在地面上且没有播放第二次跳跃动画,则设置跳跃动画为trueelse if (Input.GetButtonDown("Jump") && !isGrounded && !animator.GetBool("TiaoYue2")){animator.SetBool("DaiJi", false);animator.SetBool("TiaoYue", true);}
}
6. 地面检测(CheckGround)功能
CheckGround方法用于检测玩家是否在地面上。这通过检查玩家的脚部碰撞体是否接触地面层来实现。
void CheckGround()
{// 检查玩家是否在地面上isGrounded = myFeet.IsTouchingLayers(LayerMask.GetMask("Ground"));
}
结论
通过上述脚本,我们了解了Unity2D游戏开发中实现玩家控制的基本方法。这个脚本展示了如何使用Unity的输入系统、Rigidbody2D组件和Animator组件来实现平滑的玩家移动、跳跃和动画切换。开发者可以根据自己的游戏需求对脚本进行修改和扩展,以实现更复杂的玩家控制逻辑。
相关文章:
Unity2D游戏开发-玩家控制
在Unity2D游戏开发中,玩家控制是游戏互动性的核心。本文将解析一个典型的Unity2D玩家控制脚本,探讨如何实现流畅的玩家移动、跳跃和动画切换。以下是一个Unity脚本示例,实现了这些基础功能。 1. 脚本结构 using System.Collections; using …...
如何在 Windows 11 上免费恢复永久删除的文件
虽然Windows 上的已删除文件恢复不简单,但您可能希望免费或无需任何软件即可恢复已删除的文件。下面,我们列出了一个指南,其中包含有关如何在 Windows 11 上免费检索永久删除的文件的说明。 #1 奇客数据恢复 奇客数据恢复是一个广受好评的免…...
Spring boot 集成mybatis-plus
Spring boot 集成mybatis-plus 背景 Spring boot集成mybatis后,我们可以使用mybatis来操作数据。然后,我们还是需要写许多重复的代码和sql语句,比如增删改查。这时候,我们就可以使用 mybatis-plus了,它可以极大解放我…...
数据仓库之缓慢变化维
缓慢变化维(Slowly Changing Dimensions, SCD)是数据仓库设计中的一个重要概念,用于处理维度表中随时间缓慢变化的属性。维度表中的数据通常描述业务实体(如客户、产品、员工等),而这些实体的某些属性&…...
跑mask2former(自用)
1. 运行docker 基本命令: sudo docker ps -a (列出所有容器状态) sudo docker run -dit -v /hdd/lyh/mask2former:/mask --gpus "device0,1" --shm-size 16G --name mask 11.1:v6 (创建docker容器&…...
Linux日志服务rsyslog深度解析(上)
🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、日志在Linux系统中的作用 2、rsyslog历史背景 …...
python的df.describe()函数
一、初识describe()函数 在数据分析和处理的过程中,我们经常需要了解数据的基本统计信息,如均值、标准差、最小值、最大值等。pandas库中的describe()函数为我们提供了这样的功能,它可以快速生成数据集的描述性统计信息。 二、describe()函数的基本用法 describe()函数是pan…...
Feign的介绍与说明
Feign是Spring Cloud提供的一个声明式、模板化的HTTP客户端,旨在使编写Java HTTP客户端变得更容易。它的设计目标是让Web服务调用变得更加简单,无论是在本地还是在远程。使用Feign,开发者可以像调用本地服务一样调用远程服务,提供…...
【Linux】用户和组的管理、综合实训
目录 实训1:用户的管理 实训2:组的管理 实训3:综合实训 实训1:用户的管理 (1)创建一个新用户userl,设置其主目录为/home/user 1。 (2)查看/etc/passwd 文件的最后一行,看看是如何记录的。 (3)查看文件/etc/shadow文件的最后一…...
B=2W,奈奎斯特极限定理详解
一直没搞明白奈奎斯特极限定理的含义,网上搜了很久也没得到答案。最近深思几天后,终于有了点心得。顺便吐槽一下,csdn的提问栏目,有很多人用chatgpt秒回这个事,实在是解决不了问题,有时候人的问题大多数都是…...
【Pytorch 】Dataset 和Dataloader制作数据集
文章目录 Dataset 和 Dataloader定义Dataset定义Dataloader综合案例1 导入两个列表到Dataset综合案例2 导入 excel 到Dataset综合案例3 导入图片到Dataset导入官方数据集Dataset 和 Dataloader Dataset指定了数据集包含了什么,可以是自定义数据集,也可以是以及官方数据集Data…...
[Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解
目录 1.正则表达式匹配1.题目链接2.算法原理详解3.代码实现 2.交错字符串1.题目链接2.算法原理详解3.代码实现 3.两个字符串的最小ASCII删除和1.题目链接2.算法原理详解3.代码实现 4.最长重复子数组1.题目链接2.算法原理详解3.代码实现 1.正则表达式匹配 1.题目链接 正则表达…...
Ffmpeg安装和简单使用
Ffmpeg安装 下载并解压 进入官网 (https://ffmpeg.org/download.html),选择 Window 然后再打开的页面中下滑找到 release builds,点击 zip 文件下载 环境变量配置 下载好之后解压,找到 bin 文件夹,里面有3个 .exe 文件 然后复制…...
29、matlab算数运算汇总2:加、减、乘、除、幂、四舍五入
1、乘法:times, .* 语法 C A.*B 通过将对应的元素相乘来将数组 A 和 B 相乘。 C times(A,B) 是执行 A.*B 的替代方法, 1)将两个向量相乘 代码及运算 A [1 0 3]; B [2 3 7]; C A.*BC 2 0 212) 将两个数组相乘 代码及运算 A [1 0 3;…...
<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色
前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本篇构建了这样的一个实例,可以动态修改UI的主题,通过菜单栏来选择预设的自定义主题和官方主题&#…...
k8s——安全机制
一、安全机制说明 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介, 也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。 比如 kubectl 如果想…...
Linux驱动应用编程(三)UART串口
本文目录 前述一、手册查看二、命令行调试串口1. 查看设备节点2. 使用stty命令设置串口3. 查看串口配置信息4. 调试串口 三、代码编写1. 常用API2. 例程线程优化 前述 在开始实验前,请一定要检查测试好所需硬件是否使用正常,不然调试过程中出现的问题&am…...
【设计模式深度剖析】【4】【行为型】【策略模式】
文章目录 策略模式定义英文原话直译 角色类图策略接口Strategy:具体策略类上下文类Context测试类 策略模式的应用策略模式的优点策略模式的缺点策略模式的使用场景 策略模式 策略模式(Strategy Pattern) Strategy策略也称作Policy政策。 想…...
opencv dnn模块 示例(26) 目标检测 object_detection 之 yolov10
文章目录 1、yolov10简要介绍1.1、双标签分配策略1.2、架构改进1.3、性能1.4、预训练模型1.5、网络有关层说明 2、测试2.1、官方测试2.2、opencv dnn2.2.1、仅运行到内部"NMS"步骤之前的层2.2.2、完整代码2.2.2、完整实现所有层 2.3、onnxruntime测试2.4、tensorrt 1…...
【python进阶】python图形化编程之美--tkinter模块初探
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
用C#和ONNX Runtime搞定车牌识别:从模型部署到双层车牌分割的实战避坑
C#与ONNX Runtime实战:车牌识别系统开发全流程与双层车牌处理精要 车牌识别技术已经从实验室走向了各行各业,从停车场管理到交通执法,再到智慧城市建设,这项技术正在改变我们与车辆的交互方式。作为一名长期奋战在计算机视觉一线的…...
go-pry配置文件详解:自定义导入包和调试选项
go-pry配置文件详解:自定义导入包和调试选项 【免费下载链接】go-pry An interactive REPL for Go that allows you to drop into your code at any point. 项目地址: https://gitcode.com/gh_mirrors/go/go-pry go-pry是一款强大的Go语言交互式REPL工具&…...
电容耦合等离子刻蚀(CCP)在先进芯片制造中的关键作用与工艺优化
1. 电容耦合等离子刻蚀(CCP)技术解析 第一次接触CCP刻蚀设备时,我被它那看似简单却暗藏玄机的结构震撼到了——两块金属电极板,加上射频电源,就能实现纳米级的精密加工。这种利用电容耦合原理产生等离子体的技术&#…...
Qwen3.5-4B-Claude-Opus保姆级教程:Web端UI功能分区与高级参数联动说明
Qwen3.5-4B-Claude-Opus保姆级教程:Web端UI功能分区与高级参数联动说明 1. 模型与平台介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能…...
Phi-4-mini-reasoning步骤详解:supervisorctl管理服务全命令解析
Phi-4-mini-reasoning步骤详解:supervisorctl管理服务全命令解析 1. 项目介绍 Phi-4-mini-reasoning是一款由微软开发的3.8B参数轻量级开源模型,专为数学推理、逻辑推导和多步解题等强逻辑任务设计。该模型主打"小参数、强推理、长上下文、低延迟…...
服务器很卡,是CC攻击造成的吗
之前有客户反馈,服务器有一段时间使用总是会遇到卡的情况,查看并无流量攻击的情况,程序也未进行过什么修改,用户人数也没有什么变化。来咨询是什么原因导致的。导致机器卡的情况,一般有带宽不够,硬件性能不…...
音乐自由之路:Unlock-Music技术突破实战指南
音乐自由之路:Unlock-Music技术突破实战指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcod…...
深入解析Jinja2模板引擎:render与generate函数的实战应用
1. Jinja2模板引擎基础入门 第一次接触Jinja2时,我完全被它的简洁和强大震撼到了。这个由Armin Ronacher开发的模板引擎,最初是为了解决Django模板的局限性而诞生的。经过多年发展,它已经成为Python生态中最受欢迎的模板引擎之一。 安装Jinja…...
保姆级万物识别教程:阿里开源镜像快速部署,识别图片超简单
保姆级万物识别教程:阿里开源镜像快速部署,识别图片超简单 1. 开篇:为什么选择这个镜像? 今天给大家介绍一个特别实用的AI工具——阿里开源的"万物识别-中文-通用领域"镜像。这个镜像最大的特点就是简单易用ÿ…...
Qwen3.5-2B图文对话实战:上传实验数据图→自动识别坐标轴+趋势分析+结论建议
Qwen3.5-2B图文对话实战:上传实验数据图→自动识别坐标轴趋势分析结论建议 1. 引言:当AI遇见科研数据分析 作为一名科研工作者,你是否经常遇到这样的场景:实验室刚跑出一组数据,你迫不及待想分析趋势,却发…...
