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

unity实现角色体力功能【体力条+体力计算】

导读:实现功能

1、角色体力计算
2、角色疲劳动画
3、体力条制作、跟随
默认做好角色的idle/run/walk动画、切换和玩家输入,我使用的是新输入系统,动画时单变量混合树,参数Sports。
【每一部分功能根据自己需求观看哦】

1、角色体力计算

实现效果
当角色奔跑时,每秒减少1体力
角色走路时,体力不变
角色站立不动,每秒体力加1体力
玩家体力耗尽,不可移动
(1)新建一个脚本挂载到角色身上

//角色速度设置,根据isRunning来判断角色是否奔跑
private Animator animator;
private Vector2 playerInputVec;
private float walkSpeed = 2.0f;
private float runSpeed = 5.0f;
private float currentSpeed;
private float targetSpeed;
private bool isRuning;
//疲劳值设置
private float minTired = 0.0f;
public float MinTired
{get { return minTired; }
}private float maxTired = 10.0f;
public float MaxTired
{get { return maxTired; }
}
private float currentTired;
public float CurrentTired
{get { return currentTired; }
}
private float TiredIndex;void Start()
{animator = GetComponent<Animator>();
}void FixedUpdate()
{MovePlayer();CalculateTired();
}//移动输入,新输入系统获取玩家输入
public void GetPlayerMoveInput(InputAction.CallbackContext context)
{playerInputVec = context.ReadValue<Vector2>();//上下左右
}void MovePlayer()
{TiredIndex = currentTired >= maxTired ? 0 : 1;targetSpeed = isRuning ? runSpeed : walkSpeed;targetSpeed *= playerInputVec.magnitude;//当玩家没按下或没有推动摇杆,目标速度为0currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, 0.5f);animator.SetFloat("Sports", currentSpeed);
}//计算体力值,根据当前的速度来判断角色时走还是跑还是站立不动
void CalculateTired()
{if (currentSpeed <= walkSpeed && currentTired >= minTired){//角色站立不动,疲劳值每秒-1currentTired -= Time.deltaTime;}else if (currentSpeed >= runSpeed && currentTired <= maxTired){//角色跑动,疲劳值+1currentTired += Time.deltaTime;}else{//角色走动,疲劳值不变return;}//将疲劳值限制在最大最小之间currentTired = Mathf.Clamp(currentTired, minTired, maxTired);
}

2、角色体力动画

(1)设置动画
打开角色的动画器,点击图层,新建一个图层命名位“States”,该图层来放角色疲惫动画。
在这里插入图片描述
点击新建States层右侧的齿轮,可以看到下面的面板内容
其中的权重:代表该层动画的播放的程度【我们通过将疲劳值与权重相关联来表示角色不同程度的疲惫】
在这里插入图片描述
在下面的Assets中新建一个Avatar遮罩,并命名
在这里插入图片描述
点开新建的遮罩,在右侧选择“人形”(因为是人形动画),我们的疲惫动画只显示在角色的头和躯干,所以只让头和躯干是绿色就可以。
【这里意思是在该层放置的动画只播放躯干和头部的动画,所以选择下面的疲惫动画时建议选择头部和躯干是前后摇动的,显示角色劳累。】
在这里插入图片描述
设置好后,将这个遮罩拖到上面新建States层级的遮罩中,将正在混合设置为Additive【想给角色添加特色但又不取代动画】
在这里插入图片描述
然后将准备好的疲惫动画放到States层的动画器中,要将动画的循环打开。
在这里插入图片描述
这样动画设置好了,接下来通过代码来设置体力值并将体力值与该层的权重相关联。
(2)脚本编写
打开上面的角色脚本,添加如下代码

private int tiredLayerIndex;
//关于TiredWeight根据自己情况设置值
private float TiredWeight = 6.0f;
void Start()
{animator = GetComponent<Animator>();//获取State动画层级tiredLayerIndex = animator.GetLayerIndex("State");
}

在CalculateTired()最后一行添加

//将体力值与播放疲惫动画的权重相关联animator.SetLayerWeight(tiredLayerIndex,currentTired/MaxTired*TiredWeight);

3、体力条

实现效果:
消耗体力,体力条出现。疲劳值为零,体力条消失。
跟随
不同疲劳值体力条显示颜色不同

(1)体力条样式制作
【原理,两层sprite,底层是绿色,上层是灰色,随着疲劳值增加,上层的填充从0开始增加到1】

准备一个白色圆环PNG,导入unity,制成Sprite(2D和UI)
在这里插入图片描述
在这里插入图片描述
在unity中创建UI——image,命名PowerBG,在源图像中拖入这个圆环,并把颜色改为绿色
在这里插入图片描述
在该图像下方在新建一个图像,命名ShowPower,将圆环拖进源图像
将ShowPower的图像类型设置为已填充,填充方式Radial 360,填充原点为顶部,填充总数设置为1,不勾选顺时针
在这里插入图片描述
在这里插入图片描述
这样做好了体力条样式
在这里插入图片描述
(2)体力显示,颜色变化
当体力消耗三分之一,体力条变成黄色
当体力消耗三分之二,体力条变成红色
新建一个脚本,挂载到PowerBG上

[SerializeField] 
public Image progressCircle;
public BlackCoatControl showPowerObject;//要显示体力的游戏对象
private float currentTired;
private Image changeColor;
private float changColorIndex=0.3f;private void Start()
{changeColor = this.GetComponent<Image>();currentTired = showPowerObject.CurrentTired;
}private void FixedUpdate()
{ToChange();
}void ToChange()
{currentTired = showPowerObject.CurrentTired;ToChangeColor();progressCircle.fillAmount = currentTired / showPowerObject.MaxTired;
}//根据体力条不同值,像是不同颜色提示玩家体力耗尽
void ToChangeColor()
{if (currentTired>=showPowerObject.MaxTired/3&&currentTired<showPowerObject.MaxTired*2/3){changeColor.color = Color.Lerp(Color.green, Color.yellow, 0.7f);}if (currentTired>=showPowerObject.MaxTired*2/3){changeColor.color = Color.Lerp(Color.yellow, Color.red, 0.7f);}
}

返回unity,将挂载脚本对象的子物体ShowPower拖到Progress Circle
将游戏对象拖到Show Power Object中
在这里插入图片描述
(3)体力条跟随
新建一个脚本挂载到上面的PowerBG对象上

public Transform followed;
private Vector3 offset;
private Vector3 followedScreen;
private bool isRun;private void Awake()
{//使用协程为了防止当播放画面变化,体力条与人物间距离出现偏差。StartCoroutine(Wait());
}void Update()
{if (isRun){//将要跟随对象得世界坐标位置转化为屏幕空间followedScreen = Camera.main.WorldToScreenPoint(followed.transform.position);transform.position = followedScreen;transform.position = new Vector2(transform.position.x - offset.x, offset.y);}}IEnumerator Wait()
{yield return new WaitForSeconds(1f);followedScreen = Camera.main.WorldToScreenPoint(followed.transform.position);offset.x = followedScreen.x - transform.position.x;offset.z = followedScreen.z - transform.position.z;offset.y = transform.position.y;isRun = true;
}

返回unity,将游戏对象或游戏对象的子级拖到Followed中,根据自己想要将体力条放的位置来设置。
在这里插入图片描述
(4)实现玩家消耗体力时,体力条才出现。不消耗时不显示
在玩家脚本中的添加:

public GameObject Show;void ShowPowerUI()
{if(currentTired!=0)Show.SetActive(true);else{Show.SetActive(false);}
}void FixedUpdate(){ShowPowerUI();MovePlayer();CalculateTired();}

返回unity,在里面拖入上面的体力条对象
在这里插入图片描述
最后将PowerBG不显示
在这里插入图片描述
这样就完成了。

内容较多,哪里有问题感谢指出。

相关文章:

unity实现角色体力功能【体力条+体力计算】

导读&#xff1a;实现功能 1、角色体力计算 2、角色疲劳动画 3、体力条制作、跟随 默认做好角色的idle/run/walk动画、切换和玩家输入&#xff0c;我使用的是新输入系统&#xff0c;动画时单变量混合树&#xff0c;参数Sports。 【每一部分功能根据自己需求观看哦】 1、角色体…...

【深度学习所有损失函数】在 NumPy、TensorFlow 和 PyTorch 中实现(1/2)

一、说明 在本文中&#xff0c;讨论了深度学习中使用的所有常见损失函数&#xff0c;并在NumPy&#xff0c;PyTorch和TensorFlow中实现了它们。 二、内容提要 我们本文所谈的代价函数如下所列&#xff1a; 均方误差 &#xff08;MSE&#xff09; 损失二进制交叉熵损失加权二进…...

七夕好物分享,哪些礼物适合送男/女朋友?这几款好物最为合适!

七夕是个值得纪念的日子&#xff0c;牛郎织女鹊桥相会的故事百年流传&#xff0c;七夕是一个表达爱意的节日&#xff0c;送礼物是必不可少的&#xff0c;情侣们可以选择一份有意义的礼物&#xff0c;也可以选择对方需要的东西当做礼物来赠送&#xff0c;总的来说&#xff0c;送…...

C语言学习系列-->看淡指针(2)

文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实&#xff0c;可不敢说自己C语言基础学的好 一、数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4…...

Java基础篇--Character 类

Character 类是用来操作单个字符的&#xff0c;它将 char 值包装在一个对象中。 实际上&#xff0c;在 Java 中&#xff0c;char 是基本数据类型&#xff0c;而 Character 是 char 的包装类。通过 Character 类&#xff0c;可以使用一系列方法来操作字符。在创建 Character 对…...

Flutter参考资料

Flutter 官网 : https://flutter.dev/ Flutter 插件下载地址 : https://pub.dev/packages Flutter 开发文档 : https://flutter.cn/docs ( 强烈推荐 ) 官方 GitHub 地址 : https://github.com/flutter Flutter 中文社区 : https://flutter.cn/ Flutter 实用教程 : https://flut…...

sed命令如何正确修改ini配置文件

需要保证key值的唯一性 function sed_key_value_file(){key$(echo "$1" | sed s/[\/&]/\\&/g)value$(echo "$2" | sed s/[\/&]/\\&/g)# 先删除原有的value&#xff0c;然后添加新的keyvaluesed -i -e "s#${key}.*#${key}${value}#&q…...

【新版系统架构补充】-信息系统基础知识

信息系统 信息系统的5个基本功能&#xff1a;输入、存储、处理、输出和控制 信息系统的分类&#xff08;低级到高级&#xff09;&#xff1a;业务&#xff08;数据&#xff09;处理系统&#xff08;TPS/DPS&#xff09;、管理信息系统&#xff08;MIS&#xff09;、决策支持系…...

安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…...

前端遇到的面试题

1.水平垂直居中 绝对定位 transform position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);绝对定位 margin(子元素宽高知道的情况下) position:absolute; top:50%; left:50%; margin-top:-100px; margin-left:-100px;绝对定位 margin:auto position:a…...

abbitmq启动访问不了http://localhost:15672 通过修改服务登录admin

abbitmq默认的对Administration授权&#xff0c;而我的用户不是默认的Administration&#xff0c;所以后来打开服务&#xff0c;找到rabbitmq服务&#xff0c;属性&#xff0c;登陆&#xff0c;将本地系统账户修改为此账户&#xff0c;修改完成之后再重启服务&#xff0c;这时候…...

换架 3D 飞机,继续飞呀飞

相信大多数图扑 HT 用户都曾见过这个飞机的 Demo&#xff0c;在图扑发展的这十年&#xff0c;这个 Demo 是许多学习 HT 用户一定会参考的经典 Demo 之一。 这个 Demo 用简洁的代码生动地展示了 OBJ 模型加载、数据绑定、动画和漫游等功能的实现。许多用户参考这个简单的 Demo 后…...

js ?? || 使用方法

平时很常用的就是||,比如调用接口的时候&#xff0c;接口报错了需要给个默认值 const data(await getData())||{};今天遇到了一个场景&#xff0c;正常后端返回的就是false&#xff0c;如果接口报错要默认设置成true&#xff0c;但如果用了 || &#xff0c;如下&#xff0c;那…...

i茅台自动申购算法协议分析

首发地址:http://zhuoyue360.com/crack/104.html 一、引言 今日看到有人分享了i茅台自动申购的文章。但是它酷似引流文章&#xff0c;全文一张图&#xff0c;呜呜呜。无法白嫖。太可恶了&#xff0c;因此&#xff0c;我来啦~ 我来整一整&#xff0c;我也要抢茅子&#xff01; …...

【HarmonyOS】Java如何引用外部jar包

【关键字】 Java、引用jar包​ 【写在前面】 使用API6和API7开发HarmonyOS应用时&#xff0c;因为应用中只能引用SDK中开放的功能接口&#xff0c;但是部分jdk自带的接口功能在SDK中并未封装&#xff0c;要想在工程中使用jdk开放的接口功能&#xff0c;需要将jdk中的jar包通过…...

vue在线编辑表格导入导出

npm i file-saver npm i exceljs npm i luckyexcelindex.html &#xff08;方式一在html中引入&#xff09; <link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/luckysheetlatest/dist/plugins/css/pluginsCss.css /><link relstylesheet hrefhttps://cdn.jsde…...

监控Kafka的关键指标

Kafka 架构 上面绿色部分 PRODUCER&#xff08;生产者&#xff09;和下面紫色部分 CONSUMER&#xff08;消费者&#xff09;是业务程序&#xff0c;通常由研发人员埋点解决监控问题&#xff0c;如果是 Java 客户端也会暴露 JMX 指标。组件运维监控层面着重关注蓝色部分的 BROKE…...

React18 hook学习笔记

useState useState用于在函数组件中声明和管理状态 它接受初始状态&#xff0c;并返回一个状态变量和一个更新状态的函数 通过调用更新状态的函数&#xff0c;可以改变状态的值并触发组件的重新渲染 import { useState } from "react"function App() {const [obj, …...

Java038——正则表达式

一、认识正则表达式 正则表达式通常被用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串&#xff0c;这些特殊字符称为正则表达式的元字符。例如&#xff0c;“\d”表示数字 0~9 中的任何一个&#xff0c;“d”就…...

JavaScript元素选择器

目录 一、getElementsByTagName1.说明2.用法示例 二、getElementsByName1.说明2.用法示例 三、getElementById1.说明2.用法示例 四、getElementsByClassName1.说明2.用法示例 五、querySelector1.说明2.用法示例 六、querySelectorAll1.说明2.用法示例 七、综合示例 一、getEle…...

GICv3电源管理

在符合GICv3体系结构的实现中&#xff0c;CPU接口和PE必须位于相同的电源域&#xff0c;但这不必与关联的Redistributor所在的电源域相同。 这意味着可能会出现PE及其CPU interface断电&#xff0c;而Redistributor、Distributor和its上电的情况。在这种情况下&#xff0c;GIC架…...

JavaScript 性能优化实战:从原理到框架的全栈优化指南

在 Web 应用复杂度指数级增长的今天&#xff0c;JavaScript 性能优化已成为衡量前端工程质量的核心指标。本文将结合现代浏览器引擎特性与一线大厂实践经验&#xff0c;构建从基础原理到框架定制的完整优化体系&#xff0c;助你打造高性能 Web 应用。 一、性能优化基础&#x…...

Android Studio 打包时遇到了签名报错问题:Invalid keystore format

错误指出密钥库的格式无效&#xff0c;可能是由于密钥库本身的问题导致的&#xff0c;还有一种可能是由于jdk版本导致。我试过重新签名&#xff0c;也是不行&#xff0c;后来发现是JDK版本问题&#xff0c;我的Studio之前是jbr11&#xff0c;好像后来合并代码重新下载编译了项目…...

Postgresql常规SQL语句操作

目录 一、数据库与对象管理 二、数据操作 (CRUD) 三、查询优化与执行计划分析 四、事务控制 五、数据类型与高级特性应用 六、系统查询与维护 研发中的重要注意事项 在 PostgreSQL 研发中&#xff0c;以下这些 SQL 应用是极其常见且核心的操作&#xff0c;涵盖了数据库设…...

【JAVA版】意象CRM客户关系管理系统+uniapp全开源

一.介绍 CRM意象客户关系管理系统&#xff0c;是一个综合性的客户管理平台&#xff0c;旨在帮助企业高效地管理客户信息、商机、合同以及员工业绩。系统通过首页、系统管理、工作流程、审批中心、线索管理、客户管理、商机管理、合同管理、CRM系统、数据统计和系统配置等模块&…...

【HarmonyOS Next之旅】DevEco Studio使用指南(三十)

目录 1 -> 部署云侧工程 2 -> 通过CloudDev面板获取云开发资源支持 3 -> 通用云开发模板 3.1 -> 适用范围 3.2 -> 效果图 4 -> 总结 1 -> 部署云侧工程 可以选择在云函数和云数据库全部开发完成后&#xff0c;将整个云工程资源统一部署到AGC云端。…...

Unity——QFramework工具 AciontKit时序动作执行系统

AciontKit 是一个时序动作执行系统。 游戏中&#xff0c;动画的播放、延时、资源的异步加载、网络请求等&#xff0c;这些全部都是时序任务&#xff0c;而 ActionKit&#xff0c;可以把这些任务全部整合在一起&#xff0c;使用统一的 API&#xff0c;来对他们的执行进行计划。…...

智能快递地址解析接口如何用PHP调用?

一、什么是智能快递地址解析接口 随着互联网技术的普及和电子商务的迅猛发展&#xff0c;网购已成为现代人日常生活的重要组成部分。然而&#xff0c;在这个便捷的背后&#xff0c;一个看似不起眼却影响深远的问题正悄然浮现——用户填写的快递地址格式混乱、信息不全甚至错漏…...

C语言多级指针深度解析:从一级到三级的奥秘

资料合集下载链接: ​​https://pan.quark.cn/s/472bbdfcd014​​ 在C语言中,指针是理解内存和进行底层编程的关键。我们知道,一个一级指针存储的是一个变量的内存地址。但C语言的强大之处在于,指针本身也可以有自己的地址,而存储这个指针的地址的变量,就是一个更高层次…...

SQL Relational Algebra(数据库关系代数)

目录 What is an “Algebra” What is Relational Algebra? Core Relational Algebra Selection Projection Extended Projection Product&#xff08;笛卡尔积&#xff09; Theta-Join Natural Join Renaming Building Complex Expressions Sequences of Assignm…...