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.
		
		
		
		
		
			
		
			
				
	
	
		
			137 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
using NaughtyAttributes;
 | 
						|
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEditor;
 | 
						|
using UnityEngine;
 | 
						|
using Autohand;
 | 
						|
 | 
						|
namespace Autohand.Demo {
 | 
						|
    public class AutoBow : MonoBehaviour
 | 
						|
    {
 | 
						|
        public AutoAnimation bowAnimation;
 | 
						|
        public Grabbable bowHandleGrabbable;
 | 
						|
        public HeldPlaceJoint arrowPoint;
 | 
						|
        [Space]
 | 
						|
        public float drawbackRange = 0.3f;
 | 
						|
        public float drawbackSpring = 100f;
 | 
						|
        public float drawbackDamper = 10f;
 | 
						|
        public float tolerance = 0.005f;
 | 
						|
        [Space]
 | 
						|
        public Vector3 arrowForceDirection = Vector3.forward;
 | 
						|
        public float arrowForce = 1f;
 | 
						|
        public float arrowImpactForceMultiplier = 1f;
 | 
						|
        public AnimationCurve arrowForceCurve = AnimationCurve.Linear(0, 0, 1, 1);
 | 
						|
 | 
						|
        protected Grabbable arrow;
 | 
						|
        protected SpringJoint arrowJoint;
 | 
						|
 | 
						|
        int placePointIndex = 0;
 | 
						|
 | 
						|
        public void Start()
 | 
						|
        {
 | 
						|
            placePointIndex = bowAnimation.GetTransformIndex(arrowPoint.transform);
 | 
						|
            arrowPoint.enabled = false;
 | 
						|
            arrowPoint.OnPlaceEvent += OnArrowPlace;
 | 
						|
            bowHandleGrabbable.OnGrabEvent += OnBowHandleGrab;
 | 
						|
            bowHandleGrabbable.OnReleaseEvent += OnBowHandleRelease;
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        public void Update()
 | 
						|
        {
 | 
						|
            BowStringAnimation();
 | 
						|
        }
 | 
						|
 | 
						|
        float arrowPointValue = 0.5f;
 | 
						|
        public void BowStringAnimation()
 | 
						|
        {
 | 
						|
 | 
						|
            if (arrowPoint.placedObject != null)
 | 
						|
            {
 | 
						|
                var arrowHand = arrowPoint.placedObject.GetHeldBy()[0];
 | 
						|
                arrowPointValue = 0.5f;
 | 
						|
                float closestPoint = 0.5f;
 | 
						|
                for (int i = 0; i < 20; i++) {
 | 
						|
                    var postitionA = bowAnimation.GetTransformPositionAtPoint(placePointIndex, closestPoint + arrowPointValue / 2f);
 | 
						|
                    var postitionB = bowAnimation.GetTransformPositionAtPoint(placePointIndex, closestPoint - arrowPointValue / 2f);
 | 
						|
                    var postitionC = bowAnimation.GetTransformPositionAtPoint(placePointIndex, closestPoint);
 | 
						|
                    var distanceA = Vector3.Distance(postitionA, arrowPoint.placedObject.transform.position);
 | 
						|
                    var distanceB = Vector3.Distance(postitionB, arrowPoint.placedObject.transform.position);
 | 
						|
                    var distanceC = Vector3.Distance(postitionC, arrowPoint.placedObject.transform.position);
 | 
						|
 | 
						|
                    if(distanceC < distanceA && distanceC < distanceB) { }
 | 
						|
                    else if(distanceA < distanceB)
 | 
						|
                        closestPoint += arrowPointValue / 2f;
 | 
						|
                    else
 | 
						|
                        closestPoint -= arrowPointValue / 2f;
 | 
						|
 | 
						|
                    arrowPointValue /= 2f;
 | 
						|
                }
 | 
						|
 | 
						|
                bowAnimation.SetAnimation(closestPoint);
 | 
						|
            }
 | 
						|
            else if(arrowPointValue != 0) {
 | 
						|
                arrowPointValue = 0;
 | 
						|
                bowAnimation.SetAnimation(arrowPointValue);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void OnBowHandleGrab(Hand hand, Grabbable grab)
 | 
						|
        {
 | 
						|
            arrowPoint.enabled = true;
 | 
						|
        }
 | 
						|
 | 
						|
        public void OnBowHandleRelease(Hand hand, Grabbable grab)
 | 
						|
        {
 | 
						|
            arrowPoint.enabled = false;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        public void OnArrowPlace(PlacePoint point, Grabbable grab)
 | 
						|
        {
 | 
						|
            point.placedObject.OnReleaseEvent += OnArrowRelease;
 | 
						|
            if(bowHandleGrabbable.HeldCount() > 0)
 | 
						|
                point.placedObject.IgnoreHand(bowHandleGrabbable.GetHeldBy()[0], true);
 | 
						|
            point.placedObject.ignoreReleaseTime = 1f;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        public void OnArrowRelease(Hand hand, Grabbable grab)
 | 
						|
        {
 | 
						|
            if (arrowPoint.placedObject != null)
 | 
						|
            {
 | 
						|
                //arrowPoint.Destroyjoint();
 | 
						|
                arrowPoint.Remove(arrowPoint.placedObject);
 | 
						|
                if (bowHandleGrabbable.HeldCount() > 0){
 | 
						|
                    bowAnimation.SetAnimation(0);
 | 
						|
                    var bowHand = bowHandleGrabbable.GetHeldBy()[0];
 | 
						|
                    EnableCollisionDelay(3f, grab, bowHandleGrabbable.GetHeldBy()[0], arrowPoint);
 | 
						|
                }
 | 
						|
 | 
						|
                AutoArrow arrow;
 | 
						|
                if (grab.body.TryGetComponent<AutoArrow>(out arrow))
 | 
						|
                {
 | 
						|
                    arrow.FireArrow(arrowForceCurve.Evaluate(arrowPointValue)*arrowForce, grab, this);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    arrow = grab.body.gameObject.AddComponent<AutoArrow>();
 | 
						|
                    arrow.FireArrow(arrowForceCurve.Evaluate(arrowPointValue) * arrowForce, grab, this);
 | 
						|
                }
 | 
						|
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        IEnumerator EnableCollisionDelay(float delay, Grabbable grab, Hand hand, PlacePoint placePoint)
 | 
						|
        {
 | 
						|
            var preDrag = grab.body.angularDrag;
 | 
						|
            bowHandleGrabbable.IgnoreGrabbableCollisionUntilNone(grab);
 | 
						|
            placePoint.dontAllows.Add(grab);
 | 
						|
            yield return new WaitForSeconds(delay);
 | 
						|
            grab.IgnoreHand(hand, false);
 | 
						|
            placePoint.dontAllows.Remove(grab);
 | 
						|
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |