You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.5 KiB
C#
103 lines
3.5 KiB
C#
6 months ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Autohand.Demo
|
||
|
{
|
||
|
public class AutoArrow : MonoBehaviour
|
||
|
{
|
||
|
public float minPenetrationVelocity = 4f;
|
||
|
public float maxPenetrationVelocity = 20f;
|
||
|
public float minPenetrationDistance = 0.1f;
|
||
|
public float maxPenetrationDistance = 0.2f;
|
||
|
public float impactForceMultiplier = 1f;
|
||
|
public Grabbable grabbable;
|
||
|
Grabbable hitGrabbable;
|
||
|
|
||
|
public AutoBow firedBow { get; internal set; }
|
||
|
|
||
|
Vector3 direction;
|
||
|
float currforce;
|
||
|
|
||
|
public void FireArrow(float force, Grabbable arrowGrab, AutoBow firedBow)
|
||
|
{
|
||
|
grabbable = arrowGrab;
|
||
|
this.firedBow = firedBow;
|
||
|
impactForceMultiplier = firedBow.arrowImpactForceMultiplier;
|
||
|
|
||
|
currforce = force;
|
||
|
direction = transform.TransformDirection(firedBow.arrowForceDirection);
|
||
|
}
|
||
|
|
||
|
private void OnEnable() {
|
||
|
if(grabbable == null)
|
||
|
grabbable = GetComponent<Grabbable>();
|
||
|
|
||
|
grabbable.OnGrabEvent += OnGrabbed;
|
||
|
}
|
||
|
|
||
|
private void OnDisable() {
|
||
|
grabbable.OnGrabEvent -= OnGrabbed;
|
||
|
}
|
||
|
void OnGrabbed(Hand hand, Grabbable grab) {
|
||
|
grabbable.ActivateRigidbody();
|
||
|
hitGrabbable?.RemoveChildGrabbable(grab);
|
||
|
hitGrabbable = null;
|
||
|
firedBow = null;
|
||
|
}
|
||
|
|
||
|
public void FixedUpdate()
|
||
|
{
|
||
|
if (firedBow != null)
|
||
|
{
|
||
|
var currVel = direction * currforce;
|
||
|
currVel += Physics.gravity * Time.fixedDeltaTime;
|
||
|
direction = currVel.normalized;
|
||
|
grabbable.rootTransform.position += direction * Time.fixedDeltaTime * currforce;
|
||
|
grabbable.rootTransform.rotation = Quaternion.FromToRotation(firedBow.arrowForceDirection, direction);
|
||
|
grabbable.body.velocity = Vector3.zero;
|
||
|
grabbable.body.angularVelocity = Vector3.zero;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
public void OnCollisionEnter(Collision collision)
|
||
|
{
|
||
|
if (firedBow != null)
|
||
|
{
|
||
|
if (collision.rigidbody == null || collision.rigidbody != firedBow.bowHandleGrabbable.body)
|
||
|
{
|
||
|
if (currforce > minPenetrationVelocity)
|
||
|
{
|
||
|
GrabbableChild hitGrabbableChild;
|
||
|
if(collision.collider.CanGetComponent<Grabbable>(out hitGrabbable)) {
|
||
|
hitGrabbable.AddChildGrabbable(grabbable);
|
||
|
|
||
|
}
|
||
|
if (collision.collider.CanGetComponent<GrabbableChild>(out hitGrabbableChild)) {
|
||
|
|
||
|
hitGrabbable = hitGrabbableChild.grabParent;
|
||
|
hitGrabbable.AddChildGrabbable(grabbable);
|
||
|
|
||
|
}
|
||
|
|
||
|
grabbable.rootTransform.position += grabbable.body.velocity * 1 / 50f;
|
||
|
grabbable.rootTransform.parent = collision.collider.transform;
|
||
|
grabbable.DeactivateRigidbody();
|
||
|
|
||
|
}
|
||
|
|
||
|
//grabbable.body.isKinematic = false;
|
||
|
firedBow = null;
|
||
|
|
||
|
if (collision.rigidbody != null)
|
||
|
collision.rigidbody.AddForceAtPosition(impactForceMultiplier * direction * currforce, collision.contacts[0].point, ForceMode.Impulse);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|