- 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);
//}
}