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组件来实现平滑的玩家移动、跳跃和动画切换。开发者可以根据自己的游戏需求对脚本进行修改和扩展,以实现更复杂的玩家控制逻辑。

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

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

相关文章

机械设计手册第一册:公差

形位公差的标注&#xff1a; 形位公差框格中&#xff0c;不仅要表达形位公差的特征项目、基准代号和其他符号&#xff0c;还要正确给出公差带的大小、形状等内容。 1.形位公差框格&#xff1a; 形位公差框格由两个框格或多个格框组成&#xff0c;框格中的主要内容从左到右按…

(2024,扩散,去噪调度,维度,误差,收敛速度)适应基于分数的扩散模型中的未知低维结构

Adapting to Unknown Low-Dimensional Structures in Score-Based Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 引言 1.1 扩散模型 1.2 现有结果的不…

服务器硬件基础知识学习

服务器硬件基础知识涵盖了从CPU到存储&#xff0c;再到网络连接和总线技术等关键组件。 1. 处理器 - 两大流派&#xff1a;我们常用的处理器主要分为Intel和AMD两大阵营。Intel的Xeon系列和AMD的EPYC系列都是专为服务器设计的&#xff0c;它们支持多核处理&#xff0c;能够应对…

语言模型的校准技术:增强概率评估

​ 使用 DALLE-3 模型生成的图像 目录 一、说明 二、为什么校准对 LLM 模型至关重要 三、校准 LLM 概率的挑战 四、LLM 的高级校准方法 4.1 语言置信度 4.2 增强语言自信的先进技术 4.3 基于自一致性的置信度 4.4 基于 Logit 的方法 五、代理模型或微调方法 5.1 使用代…

集成算法实验与分析(软投票与硬投票)

概述 目的&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;集成多个 集成算法 Bagging&#xff1a;训练多个分类器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M​fm​(x) Boosting&#xff1a;从弱学习器开始加强&am…

排序-插入排序与选择排序

插入排序 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 打扑克牌整理手牌用的就是插入排序的思想 代码实现 void InsertSort(int* a, int n) { assert(a); …

C语言自定义类型

在C语言中&#xff0c;自定义类型可以通过typedef关键字来实现。typedef用于为现有的数据类型创建新的名称&#xff08;别名&#xff09;&#xff0c;使代码更清晰易读。自定义类型的一个常见用途是简化复杂的类型声明&#xff0c;特别是在使用结构体、枚举和函数指针时。 使用…

52、有边数限制的最短路

有边数限制的最短路 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从1号点到n号点的最多经过k条边的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;输出impossible。 注意&#xff1a;图中可…

查看 WSL2 (Windows Subsystem for Linux 2) IP 地址

查看 WSL2 [Windows Subsystem for Linux 2] IP 地址 1. ipconfig2. ping $(hostname).local3. cat /etc/resolv.conf4. ip route show5. ip addrReferences 1. ipconfig Windows 系统上与 WSL2 (Windows Subsystem for Linux 2) 接口的地址 172.31.32.1。 Microsoft Windows…

米尔MYC-Y6ULX-V2开发板测评记录

文章目录 1、板子上手体验2、板载硬件3、系统信息4、 驱动测试5、编译linux三大件7、摄像头测试9、总结 1、板子上手体验 首先非常感谢芯查查给了这样一个机会来测评这样一款性能十分强大的开发板&#xff0c;我拿到手的是MYC-Y6ULX-V2核心板及开发板&#xff0c;这块板子具有…

STM32HAL-最简单的长、短、多击按键框架

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 本文章使用最简单的写法实现长、短、多击按键框架&#xff0c;非常适合移植各类型单片机&#xff0c;特别是资源少的芯片上。接下来将在stm32单片机上实现&#xff0c;只需占用1个定时…

动态控制eBPF程序加载:检查 Tracepoint、Kprobe是否存在

前言 在 eBPF 程序开发中&#xff0c;确保程序能够在各种不同的系统配置中兼容运行是至关重要的。本文将详细介绍一个方案&#xff0c;通过动态检查Tracepoint、Kprobe是否存在&#xff0c;并结合libbpf的API接口控制 eBPF 程序的加载。这种方法不仅可以提升程序的灵活性&…

jwt 实现用户登录完整java

登录校验逻辑 用户登录的校验逻辑分为三个主要步骤&#xff0c;分别是校验验证码&#xff0c;校验用户状态和校验密码&#xff0c;具体逻辑如下 前端发送username、password、captchaKey、captchaCode请求登录。判断captchaCode是否为空&#xff0c;若为空&#xff0c;则直接…

AWS联网和内容分发服务

概况 VPC Amazon Virtual Private Cloud (Amazon VPC) 让您能够全面地控制自己的虚拟网络环境&#xff0c;包括资源放置、连接性和安全性。首先在 AWS 服务控制台中设置 VPC。然后&#xff0c;向其中添加资源&#xff0c;例如 Amazon Elastic Compute Cloud (EC2) 和 Amazon …

数据分析必备:一步步教你如何用Pandas做数据分析(15)

1、Pandas 数据丢失 Pandas 数据丢失的操作实例 在现实生活中&#xff0c;数据丢失始终是一个问题。机器学习和数据挖掘等领域在模型预测的准确性方面面临严重问题&#xff0c;因为缺少值会导致数据质量较差。在这些领域中&#xff0c;缺失值处理是使模型更准确和有效的主要重…

定个小目标之每天刷LeetCode热题(7)

今天这道题是道简单题&#xff0c;使用双指针进行迭代即可&#xff0c;画了下草图如下 代码如下 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode p head, q head.next, temp null;while (q ! nu…

【Python如何将EXCEL拆分】

文章目录 Python将一个EXCEL表拆分多个excel表Python将一个EXCEL表中一个sheet拆分多个sheet表 Python将一个EXCEL表拆分多个excel表 在Python中&#xff0c;你可以使用pandas库来读取Excel文件&#xff0c;并将一个大的Excel表格&#xff08;工作表&#xff09;拆分成多个单独…

Writerside生成在线帮助文档或用户手册软件基础使用教程

Writerside是JetBrains出的一个技术文档工具&#xff0c;既能用在JetBrains IDE上&#xff0c;也能单独用。它能帮你轻松写、建、测、发技术文档&#xff0c;像产品说明、API参考、开发指南等都能搞定。 特点&#xff1a; 文档即代码&#xff1a;它让你像管代码一样管文档&…

【大数据Spark】常见面试题(万字!建议收藏)

文章目录 入门级中等难度中高级难度数据倾斜解决方法 入门级 什么是Apache Spark&#xff1f;它与传统的MapReduce有何不同&#xff1f; Apache Spark是一个开源的分布式计算系统&#xff0c;它提供了高效的数据处理和分析能力。与传统的MapReduce相比&#xff0c;Spark具有更快…

海光CPU:国产信创的“芯“动力解读

国产信创CPU-海光CPU CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU形成三大阵营&#xff1a;自主架构、x86及ARM。自主阵营中&#xff0c;龙芯和申威以LoongArch和SW-64为基石&#xff1b;ARM阵营由鲲鹏、飞腾主导&#xff0c;依托ARM授权研发处理器&#xff1b;x86阵…