ARPG_ステータス表示機能の実装

+ボタン押下でコードを確認できます!

 

コピペしても正しく動かない場合は
エディタでアタッチし忘れている可能性が高いです。

PlayerController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField, Tooltip("移動スピード")]
private int moveSpeed;
[SerializeField]
private Animator playerAnim;
public Rigidbody2D rb;
[SerializeField]
private Animator weaponAnim;
[System.NonSerialized]
public int currentHealth;
public int maxHealth;
private bool isknockingback;
private Vector2 knockDir;
[SerializeField]
private float knockbackTime, knockbackForce;
private float knockbackCounter;
[SerializeField]
private float invincibilityTime;
private float invincibilityCounter;
public float totalStamina, recoverySpeed;
[System.NonSerialized]
public float currentStamina;
[SerializeField]
private float dashSpeed, dashLength, dashCost;
private float dashCounter, activeMoveSpeed;
void Start()
{
//HP設定
currentHealth = maxHealth;
//HPをUIに反映
GameManager.instance.UpdateHealthUI();
//移動スピード設定
activeMoveSpeed = moveSpeed;
//スタミナ&スタミナUIの設定
currentStamina = totalStamina;
GameManager.instance.UpdateStaminaUI();
}
void Update()
{
if (GameManager.instance.statusPanel.activeInHierarchy)
{
return;
}
if (invincibilityCounter > 0)
{
invincibilityCounter -= Time.deltaTime;
}
if (isknockingback)
{
knockbackCounter -= Time.deltaTime;
rb.velocity = knockDir * knockbackForce;
if (knockbackCounter <= 0)
{
isknockingback = false;
}
else
{
return;
}
}
//主人公移動
rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized * activeMoveSpeed;
//動いているときアニメーションを切り替える
if (rb.velocity != Vector2.zero)
{
if (Input.GetAxisRaw("Horizontal") != 0)
{
if (Input.GetAxisRaw("Horizontal") > 0)
{
playerAnim.SetFloat("X", 1f);
playerAnim.SetFloat("Y", 0);
weaponAnim.SetFloat("X", 1f);
weaponAnim.SetFloat("Y", 0);
}
else
{
playerAnim.SetFloat("X", -1f);
playerAnim.SetFloat("Y", 0);
weaponAnim.SetFloat("X", -1f);
weaponAnim.SetFloat("Y", 0);
}
}
else if (Input.GetAxisRaw("Vertical") > 0)
{
playerAnim.SetFloat("X", 0);
playerAnim.SetFloat("Y", 1);
weaponAnim.SetFloat("X", 0);
weaponAnim.SetFloat("Y", 1);
}
else
{
playerAnim.SetFloat("X", 0);
playerAnim.SetFloat("Y", -1);
weaponAnim.SetFloat("X", 0);
weaponAnim.SetFloat("Y", -1);
}
}
//攻撃ボタン検知
if (Input.GetMouseButtonDown(0))
{
weaponAnim.SetTrigger("Attack");
}
if (dashCounter <= 0)
{
if (Input.GetKeyDown(KeyCode.Space) && currentStamina > dashCost)
{
activeMoveSpeed = dashSpeed;
dashCounter = dashLength;
currentStamina -= dashCost;
GameManager.instance.UpdateStaminaUI();
}
}
else
{
dashCounter -= Time.deltaTime;
if (dashCounter <= 0)
{
activeMoveSpeed = moveSpeed;
}
}
currentStamina = Mathf.Clamp(currentStamina + recoverySpeed * Time.deltaTime, 0, totalStamina);
GameManager.instance.UpdateStaminaUI();
}
/// <summary>
/// 吹き飛ばし用の関数
/// </summary>
/// <param name="position"></param>
public void KnockBack(Vector3 position)
{
//ノックバック時間&判定設定
knockbackCounter = knockbackTime;
isknockingback = true;
//ノックバック方向取得&正規化
knockDir = transform.position - position;
knockDir.Normalize();
}
public void DamagePlayer(int damage)
{
if (invincibilityCounter <= 0)
{
currentHealth = Mathf.Clamp(currentHealth - damage, 0, maxHealth);
invincibilityCounter = invincibilityTime;
SoundManager.instance.PlaySE(2);
if (currentHealth == 0)
{
gameObject.SetActive(false);
SoundManager.instance.PlaySE(0);
GameManager.instance.Load();
}
}
GameManager.instance.UpdateHealthUI();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "portion" && maxHealth != currentHealth && collision.GetComponent<Items>().waitTime <= 0)
{
Items items = collision.GetComponent<Items>();
SoundManager.instance.PlaySE(1);
currentHealth = Mathf.Clamp(currentHealth + items.healthItemRecoveryValue, 0, maxHealth);
GameManager.instance.UpdateHealthUI();
Destroy(collision.gameObject);
}
}
}
GameManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
[SerializeField]
private Slider hpSlider;
[SerializeField]
private PlayerController player;
[SerializeField]
private Slider staminaSlider;
public GameObject dialogBox;
public Text dialogText;
private string[] dialogLines;
private int currentLine;
private bool justStarted;
public GameObject statusPanel;
[SerializeField]
private Text hptext, stText, atText;
[SerializeField]
private Weapon weapon;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
void Update()
{
if (dialogBox.activeInHierarchy)
{
if (Input.GetMouseButtonUp(1))
{
SoundManager.instance.PlaySE(4);
if (!justStarted)
{
currentLine++;
if (currentLine >= dialogLines.Length)
{
dialogBox.SetActive(false);
}
else
{
dialogText.text = dialogLines[currentLine];
}
}
else
{
justStarted = false;
}
}
}
if (Input.GetKeyDown(KeyCode.E))
{
ShowStatusPanel();
}
}
//HPUIの設定を更新
public void UpdateHealthUI()
{
hpSlider.maxValue = player.maxHealth;
hpSlider.value = player.currentHealth;
}
//スタミナUIの設定を更新
public void UpdateStaminaUI()
{
staminaSlider.maxValue = player.totalStamina;
staminaSlider.value = player.currentStamina;
}
public void ShowDialog(string[] lines)
{
dialogLines = lines;
currentLine = 0;
dialogText.text = dialogLines[currentLine];
dialogBox.SetActive(true);
justStarted = true;
}
public void ShowDialogChange(bool x)
{
dialogBox.SetActive(x);
}
public void Load()
{
SceneManager.LoadScene("Main");
}
public void ShowStatusPanel()
{
statusPanel.SetActive(true);
Time.timeScale = 0f;
//UI更新用関数の呼び出し
StatusUpdate();
}
public void CloseStatusePanel()
{
statusPanel.SetActive(false);
Time.timeScale = 1f;
}
public void StatusUpdate()
{
hptext.text = "体力 : " + player.maxHealth;
stText.text = "スタミナ : " + player.totalStamina;
atText.text = "攻撃力 : " + weapon.attackDamage;
}
}
view raw GameManager.cs hosted with ❤ by GitHub

他の講座クーポン【93%OFF】

関連記事

クーポン期限2023/01/24 Udemyでは定価24000円になっていますがこのクーポンページからの購入で1800円台で購入することが可能になっています! 30日以内な[…]

unity fps

 

Udemyよりお得に講座視聴可能なYouTubeメンバーシップ