- Home /
 
 
               Question by 
               Dag-Tholander · Jun 11, 2015 at 08:11 PM · 
                rpgmeleecombatsword  
              
 
              Best way to detect sword hit
Hi! I've been working on a fp/tp action rpg for a while now. The problem is the melee combat, the weapon is not working correctly, I'm having issues with Timing and Hit detection. what is the best way to detect a sword hit when the sword is actually hitting the enemy? here's my current script using Pysics.Spherecast : using UnityEngine; using System.Collections;
 public class Weapon : MonoBehaviour {
 
     //Data
 
     public bool Ranged;
     public string TypeOfWeapon;
     public int Damage = 10;
     [Range(0.2f, 4.0f)] 
     public float Weaponrange = 2.3f;
     public int Value = 100;
     public float WaitForStrike = 0.213f;
     public float WalkSidewaysInput;
     public float timeStamp;
     public int Speed = 200;
     public GameObject Projectile;
     public Transform Muzzle;
 
 
     //Art
     
     public AudioClip SwingSound;
     public AudioClip HitSound;
     private bool CanDamage = false;
 
     // Use this for initialization
     void Start () {
         //hand = transform.Find ("WeaponHand");
     }
     
     // Update is called once per frame
     void Attack() {
         //if (Input.GetButtonDown ("Fire1")) {
         if (Ranged) {
             GameObject Instance = Instantiate (Projectile, Muzzle.position, transform.rotation) as GameObject;
             Instance.GetComponent<Rigidbody> ().velocity = transform.TransformDirection (Vector3.forward * Speed);
         }
         if((!CanDamage) && (!Ranged)){
             timeStamp += Time.time;
         
             if (timeStamp >= WaitForStrike)
             {
                 CanDamage = true;
                 Debug.Log("CanHit");
             }
             }
         //}
     }
 
 
 
     void Update (){
         int layerMask = 1 << 11;
         layerMask = ~layerMask;
         RaycastHit hit;
         //Transform RaycastPoint = GameObject.Find ("CameraMain").transform;
         if ((CanDamage) && (!Ranged)) {
             if(Physics.SphereCast(transform.position, 1.5f, transform.up, out hit,  Weaponrange / 3,layerMask)){
             hit.transform.gameObject.BroadcastMessage ("ApplyDamage", Damage, SendMessageOptions.DontRequireReceiver);
 
             }
             CanDamage = false;
             timeStamp = 0;
         }
 
     }
 
     void OnDrawGizmos () {
         Gizmos.DrawSphere (new Vector3(transform.position.x, transform.position.y, transform.position.z  + Weaponrange / 3), 0.6f);
     }
 
 
 }
 
 
           
 
 
 
         
 
 Attack () is called by the Player and AI.
   
 
              
               Comment
              
 
               
              I've updated my script, the only problem now is that i don't know how to call a function x amount of seconds. Here's my script :
using UnityEngine; using System.Collections;
public class Weapon : $$anonymous$$onoBehaviour {
 //Data
 public bool Ranged;
 public string TypeOfWeapon;
 public int Damage = 10;
 [Range(0.2f, 4.0f)] 
 public float Weaponrange = 2.3f;
 public int Value = 100;
 public float WaitForStrike = 0.213f;
 public float WalkSidewaysInput;
 public float timeStamp;
 public int Speed = 200;
 public GameObject Projectile;
 public Transform $$anonymous$$uzzle;
 //Art
 
 public AudioClip SwingSound;
 public AudioClip HitSound;
 private bool CanDamage = false;
 // Use this for initialization
 void Start () {
     CanDamage = false;
     //hand = transform.Find ("WeaponHand");
 }
 
 // Update is called once per frame
 void Attack() {
     //if (Input.GetButtonDown ("Fire1")) {
     if (Ranged) {
         GameObject Instance = Instantiate (Projectile, $$anonymous$$uzzle.position, transform.rotation) as GameObject;
         Instance.GetComponent<Rigidbody> ().velocity = transform.TransformDirection (Vector3.forward * Speed);
     }
     if((!CanDamage) && (!Ranged)){
         //timeStamp += Time.deltaTime;
     
         //if (timeStamp >= WaitForStrike)
         //{
             //CanDamage = true;
             //Debug.Log("CanHit");
         //}
         }
     //}
 }
 void Update (){
     int layer$$anonymous$$ask = 1 << 11;
     layer$$anonymous$$ask = ~layer$$anonymous$$ask;
     RaycastHit hit;
     Transform RaycastPoint = GameObject.Find ("Camera$$anonymous$$ain").transform;
     if ((CanDamage) && (!Ranged)) {//((CanDamage) && 
         if (Physics.Raycast (transform.position, transform.up, out hit,Weaponrange, layer$$anonymous$$ask)) {
             hit.transform.gameObject.Broadcast$$anonymous$$essage ("ApplyDamage", (Damage * Random.Range(0.5f , 1.5f)), Send$$anonymous$$essageOptions.DontRequireReceiver);
             //Debug.Log($$anonymous$$athf.RoundToInt(Damage * GetComponent<Rigidbody>().angularVelocity.magnitude));
             CanDamage = false;
             timeStamp = 0;
         }
     }
 }
 void OnDrawGizmos () {
     //Gizmos.DrawSphere (new Vector3(transform.position.x, transform.position.y, transform.position.z  + Weaponrange / 3), 0.6f);
     Gizmos.DrawLine (transform.position, new Vector3(transform.position.x,transform.position.y + Weaponrange, transform.position.z));
 }
 //void OnTriggerEnter (Collider col ) {
     //CanDamage = true;
     //Debug.Log("CanHit");
 //}
 //void OnTriggerEnter (Collider col) {
 //if ((CanDamage) && (!Ranged)){
 //col.transform.gameObject.Broadcast$$anonymous$$essage ("ApplyDamage", Damage, Send$$anonymous$$essageOptions.DontRequireReceiver);
 //}
 
                  }
Your answer