Files
gpd-324/Network/Assets/Scripts/NetworkPlayer.cs
T

75 lines
2.1 KiB
C#

using System;
using Unity.Netcode;
using UnityEngine;
namespace DefaultNamespace
{
public class NetworkPlayer : NetworkBehaviour
{
[SerializeField] private Camera camera;
[SerializeField] private float speed = 10.0f;
[SerializeField] private float rotationSpeed = 60.0f;
[SerializeField] private Rigidbody bulletPrefab;
[SerializeField] private float bulletForce = 50.0f;
[SerializeField] private float initialHealth = 100.0f;
private NetworkVariable<float> _health = new NetworkVariable<float>(0);
public override void OnNetworkSpawn()
{
camera.gameObject.SetActive(IsLocalPlayer);
if (IsLocalPlayer)
{
_health.OnValueChanged += OnHealthChanged;
}
if (IsServer)
{
_health.Value = initialHealth;
}
}
public override void OnNetworkDespawn()
{
if (IsLocalPlayer)
{
_health.OnValueChanged -= OnHealthChanged;
}
}
private void OnHealthChanged(float previousValue, float newValue)
{
// update health bar etc.
}
private void Update()
{
if (!IsLocalPlayer) return;
if (Input.GetButtonDown("Fire1"))
{
ShootRpc();
}
}
private void FixedUpdate()
{
if (!IsLocalPlayer) return;
transform.Translate(
(Vector3.right * Input.GetAxis("Horizontal") + Vector3.forward * Input.GetAxis("Vertical")) *
(speed * Time.deltaTime));
transform.Rotate(Vector3.up, Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime);
}
[Rpc(SendTo.Server)]
private void ShootRpc()
{
Rigidbody bullet = Instantiate(bulletPrefab, transform.position + transform.forward, transform.rotation);
bullet.GetComponent<NetworkObject>().Spawn();
bullet.AddForce(transform.forward * bulletForce, ForceMode.Impulse);
}
}
}