- Home /
Question by
TyrantKoala · Jul 25, 2017 at 09:16 PM ·
networkingraycastfpsshootingnetwork.instantiate
my game isnt taking damage when a raycast hits?
Here is my Gun Script,
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Gun : NetworkBehaviour
{
public float damage = 10f;
public float range = 100f;
public float impactForce = 30f;
public float firerate = 15f;
public int MaxAmmo = 10;
private int currentAmmo;
public float reloadTime = 5f;
private bool isReloading = false;
public Camera fpsCam;
public ParticleSystem HitAnime;
public GameObject ImpactEffect;
public Animator animator;
private float nextTimeToFire = 0f;
// Update is called once per frame
private void Start()
{
currentAmmo = MaxAmmo;
}
private void OnEnable()
{
isReloading = false;
animator.SetBool("Reloading", false);
}
void Update()
{
if (isReloading)
return;
if (currentAmmo <= 0)
{
StartCoroutine(Reload());
return;
}
if (Input.GetButton("Fire1") && Time.time >= nextTimeToFire)
{
nextTimeToFire = Time.time + 1f / firerate;
Shoot();
}
}
IEnumerator Reload ()
{
isReloading = true;
Debug.Log("Reloading...");
animator.SetBool("Reloading", true);
yield return new WaitForSeconds(reloadTime);
currentAmmo = MaxAmmo;
isReloading = false;
animator.SetBool("Reloading", false);
}
void Shoot()
{
currentAmmo--;
RaycastHit hit;
if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
{
Debug.Log(hit.transform.name);
Target target = hit.transform.GetComponent<Target>();
if (target != null)
{
target.TakeDamage(damage);
HitAnime.Play();
}
{
var hitPlayer = hit.collider.gameObject;
CmdDoShotSomeone(gameObject, hitPlayer);
}
}
if (hit.rigidbody != null)
{
hit.rigidbody.AddForce(hit.normal * impactForce);
}
GameObject ImpactGO = Instantiate(ImpactEffect, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(ImpactGO, 2f);
}
[Command]
void CmdDoShotSomeone(GameObject fromPlayer, GameObject hitPlayer)
{
hitPlayer.GetComponent<Health>().TakeDamage(fromPlayer);
Debug.Log("hit player");
}
}
Here is my health script `using UnityEngine;
using System.Collections; using UnityEngine.Networking;
public class Health : NetworkBehaviour { [SyncVar(hook = "OnHealthChanged")] public int health; [SyncVar] Vector3 respawnPos;
public override void OnStartLocalPlayer()
{
CmdSetHealth(100);
}
[Command]
void CmdSetHealth(int newHealth)
{
health = newHealth;
}
[Server]
public void TakeDamage(GameObject fromPlayer)
{
health = Mathf.Max(health - 10, 0);
if (health <= 0)
{
DoDeath();
}
}
[Server]
void DoDeath()
{
respawnPos = GetRandomSpawnPoint();
RpcHandlePlayerDeath();
}
[Server]
Vector3 GetRandomSpawnPoint()
{
var spawnPoints = NetworkManager.singleton.startPositions;
return spawnPoints[Random.Range(0, spawnPoints.Count)].position;
}
[ClientRpc]
void RpcHandlePlayerDeath()
{
if (isLocalPlayer)
{
transform.position = respawnPos;
CmdSetHealth(100);
}
}
void OnHealthChanged(int newHealth)
{
health = newHealth;
if (isLocalPlayer)
{
HUD.instance.DisplayHealth(health);
}
}
}`
Any help is greatly appreciated knowing that I am a noob :)
Comment
Try and trim your code, no one want's to sift though 150+ lines to figure out what exactly your issue is.
You have a bunch of debug.log statements already in there. Are any of them being printed in the console, and if so, which ones?
Answer by TyrantKoala · Jul 27, 2017 at 02:23 PM
The debug shows the raycat hitting something. But it never takes damage or kills the player from the server. @bobisgod234