Files
FablishRPG/Assets/Scripts/Weapon.cs

76 lines
2.3 KiB
C#

using UnityEngine;
public class Weapon : MonoBehaviour
{
public enum HitShape { Sphere, Box }
[Header("Combat Stats")]
public float damage = 10f;
[Tooltip("How much damage is blocked when holding block with this weapon? (0.0 to 1.0)")]
[Range(0f, 1f)] public float blockReductionPercentage = 0.5f;
[Header("Hit Detection")]
public HitShape hitShape = HitShape.Sphere;
[Tooltip("Used if HitShape is Sphere")]
public float attackRadius = 1.0f;
[Tooltip("Used if HitShape is Box (represents half the size of the box on X, Y, Z)")]
public Vector3 hitBoxHalfExtents = new Vector3(0.5f, 0.5f, 1f);
[Tooltip("Optional: Drag a child GameObject here to act as the center of the hit shape. If left empty, uses the weapon's base transform.")]
public Transform hitCenter;
[Header("Equip Offsets")]
public Vector3 equippedPositionOffset = Vector3.zero;
public Vector3 equippedRotationOffset = Vector3.zero;
[Header("Unequip Offsets")]
public Vector3 unequippedPositionOffset = Vector3.zero;
public Vector3 unequippedRotationOffset = Vector3.zero;
/// <summary>
/// Gets the world position where hit detection should occur.
/// </summary>
public Vector3 GetHitCenter()
{
if (hitCenter != null)
{
return hitCenter.position;
}
return transform.position;
}
/// <summary>
/// Gets the world rotation for box cast alignment.
/// </summary>
public Quaternion GetHitRotation()
{
if (hitCenter != null)
{
return hitCenter.rotation;
}
return transform.rotation;
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Vector3 center = GetHitCenter();
if (hitShape == HitShape.Sphere)
{
Gizmos.DrawWireSphere(center, attackRadius);
}
else if (hitShape == HitShape.Box)
{
// Gizmos.DrawWireCube does not support rotation natively, so we modify the Gizmo matrix
Matrix4x4 oldMatrix = Gizmos.matrix;
Gizmos.matrix = Matrix4x4.TRS(center, GetHitRotation(), Vector3.one);
Gizmos.DrawWireCube(Vector3.zero, hitBoxHalfExtents * 2f);
Gizmos.matrix = oldMatrix;
}
}
}