You are currently viewing 【Unity教學】2022製作多人連線遊戲的最佳選擇!Photon Fusion 05 生命值與血條

【Unity教學】2022製作多人連線遊戲的最佳選擇!Photon Fusion 05 生命值與血條

  • Post category:教學
  • Reading time:4 mins read
  • Post author:

大家好,我是Wilson,這次的主題是讓子彈可以傷害玩家,並讓玩家擁有生命的機制!

領取Photon Fusion 快速上手懶人攻略

這邊幫大家準備了【Photon Fusion 快速上手懶人攻略】!

裡面介紹了Fusion的基本功能,以及Fusion同步網路狀態的3大方法,有興趣的朋友可以免費領取喔!

素材

製作血條的白色正方形圖片

重點回顧

  • 為了保證遊戲公平,生命值的計算統一使用Object.HasStateAuthority限制只在擁有State Authority的Server或Host上。
  • [Networked]屬性可以添加OnChanged事件,並提供我們自定的方法來監聽變數的變化。
[Networked(OnChanged = nameof(OnHpChanged))]
public int Hp { get; set; }

private static void OnHpChanged(Changed<PlayerController> changed)
{
    changed.Behaviour.hpBar.fillAmount = (float)changed.Behaviour.Hp / changed.Behaviour.maxHp;
}
  • 我們自訂的這個OnChanged方法必須要是static,並傳入一個Changed<T>的參數,代表變化後的值。
  • 在方法裡面要存取物件的值要透過changed.Behaviour
Object.HasStateAuthority說明

Code

Bullet.cs新增的判定碰撞

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        var player = other.GetComponent<PlayerController>();

        player.TakeDamage(10);

        Runner.Despawn(Object);
    }
}

PlayerController.cs新增的部分

public class PlayerController : NetworkBehaviour
{
    /*略*/

    [SerializeField]
    private Image hpBar = null;

    [SerializeField]
    private int maxHp = 100;

    [Networked(OnChanged = nameof(OnHpChanged))]
    public int Hp { get; set; }

    /*略*/

    public override void Spawned()
    {
        if(Object.HasStateAuthority)
            Hp = maxHp;
    }

    public override void FixedUpdateNetwork()
    {
	/*略*/
        if(Hp <= 0 || networkCharacterController.transform.position.y <= -5f)
        {
            Respawn();
        }
    }

    private void Respawn()
    {
        networkCharacterController.transform.position = Vector3.up * 2;
        Hp = maxHp;
    }

    public void TakeDamage(int damage)
    {
        if (Object.HasStateAuthority)
        {
            Hp -= damage;
        }
    }

    private static void OnHpChanged(Changed<PlayerController> changed)
    {
        changed.Behaviour.hpBar.fillAmount = (float)changed.Behaviour.Hp / changed.Behaviour.maxHp;
    }
}

專案GitHub

這次進度的專案可以在這裡看到!

Leave a Reply