namespace VRTK.Examples.Archery
|
|
{
|
|
using UnityEngine;
|
|
|
|
public class Arrow : MonoBehaviour
|
|
{
|
|
public float maxArrowLife = 10f;
|
|
public float maxCollidedLife = 1f;
|
|
[HideInInspector]
|
|
public bool inFlight = false;
|
|
|
|
private bool collided = false;
|
|
private Rigidbody rigidBody;
|
|
private GameObject arrowHolder;
|
|
private Vector3 originalPosition;
|
|
private Quaternion originalRotation;
|
|
private Vector3 originalScale;
|
|
private AudioSource source;
|
|
|
|
public void SetArrowHolder(GameObject holder)
|
|
{
|
|
arrowHolder = holder;
|
|
arrowHolder.SetActive(false);
|
|
}
|
|
|
|
public void OnNock()
|
|
{
|
|
collided = false;
|
|
inFlight = false;
|
|
}
|
|
|
|
public void Fired()
|
|
{
|
|
if (source != null)
|
|
{
|
|
source.Play();
|
|
}
|
|
DestroyArrow(maxArrowLife);
|
|
}
|
|
|
|
public void ResetArrow()
|
|
{
|
|
DestroyArrow(maxCollidedLife);
|
|
collided = true;
|
|
inFlight = false;
|
|
RecreateNotch();
|
|
ResetTransform();
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
rigidBody = GetComponent<Rigidbody>();
|
|
SetOrigns();
|
|
source = GetComponent<AudioSource>();
|
|
}
|
|
|
|
private void SetOrigns()
|
|
{
|
|
originalPosition = transform.localPosition;
|
|
originalRotation = transform.localRotation;
|
|
originalScale = transform.localScale;
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
if (!collided)
|
|
{
|
|
transform.LookAt(transform.position + rigidBody.velocity);
|
|
}
|
|
}
|
|
|
|
private void OnCollisionEnter(Collision collision)
|
|
{
|
|
if (inFlight && isActiveAndEnabled && gameObject.activeInHierarchy)
|
|
{
|
|
ResetArrow();
|
|
}
|
|
}
|
|
|
|
private void RecreateNotch()
|
|
{
|
|
//swap the arrow holder to be the parent again
|
|
arrowHolder.transform.SetParent(null);
|
|
arrowHolder.SetActive(true);
|
|
|
|
//make the arrow a child of the holder again
|
|
transform.SetParent(arrowHolder.transform);
|
|
|
|
//reset the state of the rigidbodies and colliders
|
|
GetComponent<Rigidbody>().isKinematic = true;
|
|
GetComponent<Collider>().enabled = false;
|
|
arrowHolder.GetComponent<Rigidbody>().isKinematic = false;
|
|
}
|
|
|
|
private void ResetTransform()
|
|
{
|
|
arrowHolder.transform.position = transform.position;
|
|
arrowHolder.transform.rotation = transform.rotation;
|
|
transform.localPosition = originalPosition;
|
|
transform.localRotation = originalRotation;
|
|
transform.localScale = originalScale;
|
|
}
|
|
|
|
private void DestroyArrow(float time)
|
|
{
|
|
Destroy(arrowHolder, time);
|
|
Destroy(gameObject, time);
|
|
}
|
|
}
|
|
}
|