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