73 lines
2.0 KiB
C#
73 lines
2.0 KiB
C#
using System;
|
|
using Unity.Netcode;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace DefaultNamespace
|
|
{
|
|
public class NetworkPlayer : NetworkBehaviour
|
|
{
|
|
[Header( "Player Settings" )]
|
|
[SerializeField] private float speed = 10.0f;
|
|
[SerializeField] private float initialHealth = 100.0f;
|
|
|
|
[Header( "Elements")]
|
|
[SerializeField] private Camera playerCamera;
|
|
[SerializeField] private Canvas playerCanvas;
|
|
[SerializeField] private Image playerHealthBar;
|
|
|
|
[Header( "Prefabs" )]
|
|
[SerializeField] private NetworkObject projectilePrefab;
|
|
|
|
private NetworkVariable<float> _health = new NetworkVariable<float>();
|
|
|
|
public override void OnNetworkSpawn()
|
|
{
|
|
playerCamera.gameObject.SetActive(IsLocalPlayer);
|
|
playerCanvas.gameObject.SetActive(IsLocalPlayer);
|
|
|
|
if (IsLocalPlayer)
|
|
{
|
|
_health.OnValueChanged += OnValueChanged;
|
|
}
|
|
|
|
if (IsServer)
|
|
{
|
|
_health.Value = initialHealth;
|
|
}
|
|
}
|
|
|
|
public override void OnNetworkDespawn()
|
|
{
|
|
if (IsLocalPlayer)
|
|
{
|
|
_health.OnValueChanged -= OnValueChanged;
|
|
}
|
|
}
|
|
|
|
private void OnValueChanged(float previousValue, float newValue)
|
|
{
|
|
playerHealthBar.fillAmount = newValue / initialHealth;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!IsLocalPlayer) return;
|
|
|
|
Vector3 input = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
|
|
transform.Translate(input * (speed * Time.deltaTime));
|
|
|
|
if (Input.GetButtonDown("Fire1"))
|
|
{
|
|
FireProjectileRpc();
|
|
}
|
|
}
|
|
|
|
[Rpc(SendTo.Server)]
|
|
private void FireProjectileRpc()
|
|
{
|
|
NetworkObject projectile = Instantiate(projectilePrefab, transform.position, Quaternion.identity);
|
|
projectile.Spawn(true);
|
|
}
|
|
}
|
|
} |