勉強中は、モンスターの血量と血バー表示のスクリプトを書いて、最初にコードをアップロードしました。
ゲーム内の血液量バーの制作
1.まず書き方を示します
2つの画像ファイルを長方形のバーに引き伸ばし、その組み合わせをプレハブにします。
ソース画像に正方形を設定し、画像タイプを塗りつぶし (塗りつぶしタイプ) に設定すると、塗りつぶし量で血液バーの表示を制御できます!
Dotween プラグインを使用して、血液量遅延減少のアニメーション効果が完成しました
ここでは 2 秒以内に、healthSlider.fillAmount (現在の血液量) の値が、sliderPercent (ダメージを差し引いた後の血液量) になります。
DOTween.To(() => healthSlider.fillAmount, x => healthSlider.fillAmount = x, sliderPercent, 2);//血量变化
マウントスクリプト
スクリプトは次のとおりで、モンスター ゲーム オブジェクトにマウントされます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
/// <summary>
/// 控制怪物血量条的展示和跟随
/// </summary>
public class Healthbar_UI : MonoBehaviour
{
public GameObject HealthUIPrefab;//血条的预制体
public GameObject barpoint;//怪物的血条位置
Image healthSlider;//血量的滑动条
Transform UIbar;//血条位置
Transform cam;//摄像机位置
public bool alwaysVisible = false;//是否可见
public float visibleTime;//可见时长
private float TimeLeft;//剩余可见时长
private void OnEnable()
{
cam = Camera.main.transform;//挂载摄像机
UIbar = Instantiate(HealthUIPrefab,this.transform, barpoint).transform;
healthSlider = UIbar.GetChild(1).GetComponent<Image>();//获取绿条
UIbar.gameObject.SetActive(false);//设置是否长久可见
healthSlider.fillAmount = 1;//初始血条为满
}
private void LateUpdate()
{
//当UI不被销毁的时候,一直朝向摄像机的反方向(即面对摄像机)
if (UIbar != null)
{
UIbar.position = barpoint.transform.position;
UIbar.forward = -cam.forward;
if (TimeLeft <= 0 && !alwaysVisible)
{
UIbar.gameObject.SetActive(false);
}
else
{
TimeLeft -= Time.deltaTime;
}
}
}
/// <summary>
/// 控制血量展示
/// </summary>
/// <param name="currentHealth">当前的生命值</param>
/// <param name="maxHealth">最大血量</param>
public void UpdateHralthBar( float currentHealth, float maxHealth)
{
//当血量归0时,摧毁血条
if (currentHealth <= 0)
Destroy(UIbar.gameObject);
TimeLeft = visibleTime;//每次重新攻击,血条显示时间都会重置
UIbar.gameObject.SetActive(true); //设置血量时,血条出现
float sliderPercent = currentHealth / maxHealth;
DOTween.To(() => healthSlider.fillAmount, x => healthSlider.fillAmount = x, sliderPercent, 2);//血量变化
}
}
モンスターに対応する血量スクリプトは次のとおりです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 修改怪物血量的脚本
/// </summary>
public class MonsterHealth : MonoBehaviour
{
[Header("怪物生命值")]
public float HP;//怪物的生命值
private float HP_MAX;//怪物最大生命值
private void Start()
{
HP_MAX = HP;//初始化怪物最大生命值
}
//对于伤害进行判定
public void DamageJudge(string AttackedWeapon)
{
float before = 0;
//受到什么样的武器攻击
switch (AttackedWeapon) {
case "Weapon":
AddHP(-3);
AttackedWeapon = null;//将碰撞消息设置为空
break;
case "Bullet":
AddHP(-5);
AttackedWeapon = null;//将碰撞消息设置为空
break;
case "Attack3Effect":
AddHP(-6);
break;
}
this.GetComponentInChildren<Healthbar_UI>().UpdateHralthBar(HP, HP_MAX);//设置血条详情//设置血条详情
if (HP == 0)
{
Destroy(this.gameObject);//销毁自身
}
}
//增减怪物血量
public void AddHP(float value)
{
float Before = HP;//返回一个当前血量
HP += value;
HP = Mathf.Clamp(HP, 0, HP_MAX);//保证血量只会削减到0(而不是负数)
}
}
PS. これについては、ここに単純な switch 文を書くのではなく、コライダーのメッセージを受け取った後、JSON ファイルから武器を検索し、対応する攻撃ダメージを取得してダメージ値を計算する必要がありますが、私は一時的にまだjsonテーブルを理解していないため、最適化する必要があります.
完全な効果
境界判定コード(コリジョンボディとタグコール)
/// <summary>
/// 检测是否掉出游戏边界的类
/// </summary>
public class GameBoundary: MonoBehaviour
{
private void OnCollisionEnter(Collision collision)
{
//如果掉落下来的是玩家,就将玩家放回初始化位置
if (collision.gameObject.tag == "Player")
{
collision.gameObject.transform.position = new Vector3(5.7f, 0, 0);
}
else//销毁掉落到当前位置的其他对象(敌人)
{
Destroy(collision.gameObject);
}
}
}