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.
		
		
		
		
		
			
		
			
	
	
		
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using UnityEngine.Events;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand.Demo{
							 | 
						||
| 
								 | 
							
								    public delegate void SmashEvent(Smasher smasher, Smash smashable);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [HelpURL("https://app.gitbook.com/s/5zKO0EvOjzUDeT2aiFk3/auto-hand/extras/smashing")]
							 | 
						||
| 
								 | 
							
								    public class Smasher : MonoBehaviour{
							 | 
						||
| 
								 | 
							
								        public Rigidbody rb;
							 | 
						||
| 
								 | 
							
								        [Header("Options")]
							 | 
						||
| 
								 | 
							
								        public LayerMask smashableLayers;
							 | 
						||
| 
								 | 
							
								        [Tooltip("How much to multiply the magnitude on smash")]
							 | 
						||
| 
								 | 
							
								        public float forceMulti = 1;
							 | 
						||
| 
								 | 
							
								        [Tooltip("Can be left empty - The center of mass point to calculate velocity magnitude - for example: the camera of the hammer is a better point vs the pivot center of the hammer object")]
							 | 
						||
| 
								 | 
							
								        public Transform centerOfMassPoint;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Header("Event")]
							 | 
						||
| 
								 | 
							
								        public UnityEvent OnSmash;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //Progammer Events <3
							 | 
						||
| 
								 | 
							
								        public SmashEvent OnSmashEvent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Vector3[] velocityOverTime = new Vector3[3];
							 | 
						||
| 
								 | 
							
								        Vector3 lastPos;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								        private void Start(){
							 | 
						||
| 
								 | 
							
								            if(rb == null)
							 | 
						||
| 
								 | 
							
								                rb = GetComponent<Rigidbody>();
							 | 
						||
| 
								 | 
							
								            if(smashableLayers == 0)
							 | 
						||
| 
								 | 
							
								                smashableLayers = LayerMask.GetMask(Hand.grabbableLayerNameDefault);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            OnSmashEvent += (smasher, smashable) => { OnSmash?.Invoke(); };
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void FixedUpdate() {
							 | 
						||
| 
								 | 
							
								            for(int i = 1; i < velocityOverTime.Length; i++) {
							 | 
						||
| 
								 | 
							
								                velocityOverTime[i] = velocityOverTime[i-1];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            velocityOverTime[0] = lastPos - (centerOfMassPoint ? centerOfMassPoint.position : rb.position);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            lastPos = centerOfMassPoint ? centerOfMassPoint.position : rb.position;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private void OnCollisionEnter(Collision collision) {
							 | 
						||
| 
								 | 
							
								            Smash smash;
							 | 
						||
| 
								 | 
							
								            if(collision.transform.CanGetComponent(out smash)){
							 | 
						||
| 
								 | 
							
								                if(GetMagnitude() >= smash.smashForce){
							 | 
						||
| 
								 | 
							
								                    smash.DoSmash();
							 | 
						||
| 
								 | 
							
								                    OnSmashEvent?.Invoke(this, smash);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        float GetMagnitude() {
							 | 
						||
| 
								 | 
							
								            Vector3 velocity = Vector3.zero;
							 | 
						||
| 
								 | 
							
								            for(int i = 0; i < velocityOverTime.Length; i++) {
							 | 
						||
| 
								 | 
							
								                velocity += velocityOverTime[i];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return (velocity.magnitude/velocityOverTime.Length)*forceMulti*10;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |