目录
学习的教程
【unity2021入门教程】69-2D游戏开发教程系列-03-RubyAdventure2DRpg官方教程-17-设置掉血区域_哔哩哔哩_bilibili
1 伤害区域减伤太快
跟之前的一样,这篇博客依旧是基于B站这个入门教程来写的。起因也很简单,在跟着教程学习设置掉血区域时遇到了如下问题:
如果仅仅使用OnTriggerStay进行减伤,由于这个调用是逐帧的,会造成减伤区域减伤速度太快的问题。
跟着教程的方法修改了玩家对象的Rigidbody2D组件中的Sleeping Mode,也达不到延缓的效果,也没办法控制减血速度。
2 双血条方法
所谓的双血条,其实就是添加真、假两个减血变量。
- 真血条用来给当前血量减伤
- 假血条用来控制随着时间的减伤量
基于教程给的原始代码,我新定义了一些参数:
- damageSpeed——public,用户可以控制减血速度
- TruedamageHealth——与Speed相乘,成为真血条减血量
- True&round——用以判断是否调用ChangeHealth()
具体可以看以下给减伤区域挂的触发器脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DamageZone : MonoBehaviour
{
public int damageHealth = -1;
public int damageSpeed;
private double TruedamageHealth = -0.02;
private double True = 0;
int round=1;
private void OnTriggerStay2D(Collider2D other)
{
RubyController rubyController=other.GetComponent<RubyController>();
if(rubyController != null)
{
True += damageSpeed*TruedamageHealth;
if (round==1||True < round * damageHealth)
{
round++;
rubyController.ChangeHealth(damageHealth);
}
}
}
}
其中的ChangeHealth()方法,是在给玩家对象挂的脚本中定义的一个方法:
//更改生命值
//amount是游戏中加血/减血的操作
public void ChangeHealth(int amount)
{
//限制当前生命值范围为[0,maxHealth]
currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
//输出
if(currentHealth < maxHealth)
Debug.Log("当前生命值为:" + currentHealth + "/" + maxHealth);
}
其中,round==1情况单独提出来作为其中一个或条件,是因为考虑到游戏本身的情况。当玩家走入Trigger的瞬间当下是会立马减血的,Stay在减伤范围中再缓慢减血:
进入减伤触发器范围 -> 立马减伤 -> 持续呆在减伤触发器范围 -> 持续掉血
Speed控制减伤速度
最终效果
玩家进入了伤害区域
伤害情况
当然,以上只是一个超级简单的一种方法,在之后的学习一定还会涉及到比如:GUI血条体现血量等,到时候会再进行补充。