目錄
大家好,我是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。
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
這次進度的專案可以在這裡看到!