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;//当玩家没按下或没有推动摇杆,目标速度为0
    currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, 0.5f);
    animator.SetFloat("Sports", currentSpeed);
}

//计算体力值,根据当前的速度来判断角色时走还是跑还是站立不动
void CalculateTired()
{
    if (currentSpeed <= walkSpeed && currentTired >= minTired)
    {
        //角色站立不动,疲劳值每秒-1
        currentTired -= Time.deltaTime;
    }
    else if (currentSpeed >= runSpeed && currentTired <= maxTired)
    {
        //角色跑动,疲劳值+1
        currentTired += 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不显示
在这里插入图片描述
这样就完成了。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科研论文中SCI,SSCI ,CSSCI是什么

目录 1 SCI 2 SSCI 3 CSSCI 什么是SCI&#xff0c;SSCI &#xff0c;CSSCI 目前&#xff0c;在国际科学界&#xff0c;如何正确评价基础科学研究成果已引起越来越广泛的关注。而被SCI、SSCI收录的科技论文的多寡则被看作衡量一个国家的基础科学研究水平、科技实力和科技论文…

HarmonyOS SDK开放能力,服务鸿蒙生态建设,打造优质应用体验

华为开发者大会2023&#xff08;HDC.Together&#xff09;于8月4日至6日在东莞松山湖举行&#xff0c;在HarmonyOS端云开放能力技术分论坛上&#xff0c;华为为广大开发者们介绍了HarmonyOS SDK开放能力在基础开发架构、功能特性等方面的变化之处&#xff0c;通过将常见的通用能…

市面上最好用的4款免费ETL工具推荐

一、ETL介绍 ETL流程是数据仓库建设的核心环节&#xff0c;它涉及从各种数据源中抽取数据&#xff0c;经过清洗、转换和整合&#xff0c;最终加载到数据仓库中以供分析和决策。在数据仓库国产化的背景下&#xff0c;ETL流程扮演着重要的角色&#xff0c;今天我们就来讲讲ETL流…

MATLAB算法实战应用案例精讲-【图像处理】图像分类模型Swin TrasnformerViT

目录 Swin Trasnformer 1. 模型介绍 2. 模型结构 3. 模型实现 4. 模型特点 5. 模型效果 ViT( Vision Transformer) 模型介绍 模型结构与实现 1. 图像分块嵌入 2. 多头注意力 3. 多层感知机&#xff08;MLP&#xff09; 4. DropPath 5. 基础模块 6. 定义ViT网络 …

两个数组的交集-C语言/Java

描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。&#xff08;1 < nums1.length, nums2.length < 1000&#xff0c;0 < nums1[i], nums2[i] < 1000&#xff09; 示例1 输入…

TCP和UDP

目录 TCP和UDP是什么&#xff1f; TCP和UDP有什么区别? 三次握手和四次挥手 解决大量TIME_WAIT问题的核心方法 TCP维护可靠的通信方式 TCP协议的长连接和短连接 长连接的保活机制 Syn泛洪攻击 拥塞控制 滑动窗口的原理 什么是粘包以及粘包的原因 粘包的处理方式 …

centos7使用yum安装gcc8

1 概述 cenots7自带的gcc版本为4.8.5&#xff0c;不方便编译一些软件&#xff0c;需要将gcc升级。升级gcc可以通过源码编译安装&#xff0c;也可以通过yum等软件管理工具来进行安装&#xff0c;本文介绍通过yum软件来安装gcc。 2 安装过程 2.1 安装scl源 yum install -y c…

IntelliJ IDEA快捷键大全

文章目录 1、构建/编译2、文本编辑3、光标操作4、文本选择5、代码折叠6、辅助编码7、上下文导航8、查找操作9、符号导航10、代码分析11、运行和调试12、代码重构13、全局 CVS 操作14、差异查看器15、工具窗口 本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA&…

docker案例复现

$uri导致的CRLF注入漏洞 前期准备dockerdocker compose 漏洞配置 前期准备 docker 要完成这样的测试&#xff0c;需要我们有一定的环境&#xff0c;也就是需要大家去安装docker 更新系统软件包&#xff1a; sudo yum update 安装 Docker 的依赖软件包&#xff1a; sudo yum …

数据结构-队列(C语言的简单实现)

简介 队列也是一种数据结构&#xff0c;队列也可以用来存放数字每次只能向队列里将入一个数字&#xff0c;每次只能从队列里获得一个数字在队列中&#xff0c;允许插入的一段称为入队口&#xff0c;允许删除的一段称为出队口它的原则是先进先出(FIFO: first in first out)&…

ubuntu磁盘管理

show partition information 挂载设备在这 显示文件系统信息 build file system mkfs -t ext4 /dev/nvme0n1p4命令作用&#xff1a;将/dev/nvme0n1p4 格式化为 ext4 建立交换分区 mkswap -c -v1 /dev/nvme0n1p4 102400-c&#xff1a;check -v1&#xff1a;新版交换分区 -v0&…

ESP32-连接参数/间隔更新

连接间隔的设置是一个协商的过程&#xff0c;ESP32提供了一些协商的接口&#xff0c;按顺序分析一下。 Step 1&#xff1a;首先是Client连接时对Server要求的连接间隔&#xff08;确定值&#xff09; 在连接的时候&#xff0c;Client会把当前的连接间隔发送给Server。在Serve…

【腾讯云 Cloud studio 实战训练营】云端 IDE 构建移动端H5

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

deque插入和删除 功能描述&#xff1a; 向deque容器中插入和删除数据 函数原型&#xff1a; 两端插入操作&#xff1a; push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…

【torch.nn.PixelShuffle】和 【torch.nn.UnpixelShuffle】

文章目录 torch.nn.PixelShuffle直观解释官方文档 torch.nn.PixelUnshuffle直观解释官方文档 torch.nn.PixelShuffle 直观解释 PixelShuffle是一种上采样方法&#xff0c;它将形状为 ( ∗ , C r 2 , H , W ) (∗, C\times r^2, H, W) (∗,Cr2,H,W)的张量重新排列转换为形状为…

Spring Boot配置文件中的配置项加密jasypt使用

在Spring Boot中&#xff0c;有很多口令需要加密&#xff0c;如数据库连接密码、访问第三方接口的Token等。常见的方法就是用jasypt对口令进行加密。 实际上&#xff0c;jasypt可以对配置文件中任意配置项的值进行加密&#xff0c;不局限于对密码的加密。 1.在pom.xml中添加ja…

Centos操作系统新安装的Python3中安装mysqlclient库

问题简介&#xff1a; mysqlclient 是python中的一个连接MySQL数据库的重要的三方库&#xff0c;但是在centos中使用pip3 install mysqlclient 方法安装一直报错&#xff0c;经过两天时间的排查,终于找到了解决问题的方法。 [rootd3acd2b8211d /]# pip3 install mysqlclient Co…

LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

2.若依前后端分离版第一个增删查改

1.介绍 若依提供了代码生成功能&#xff0c;单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统&#xff0c;进入菜单[系统工具]-》[代码生成],点击导入按钮&#xff0c;选择需要生成代码的表进行导…