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.
		
		
		
		
		
			
		
			
	
	
		
			107 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			107 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand{
							 | 
						||
| 
								 | 
							
								    [RequireComponent(typeof(Rigidbody))]
							 | 
						||
| 
								 | 
							
								    public class HeadPhysicsFollower : MonoBehaviour{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Header("References")]
							 | 
						||
| 
								 | 
							
								        public Camera headCamera;
							 | 
						||
| 
								 | 
							
								        public Transform trackingContainer;
							 | 
						||
| 
								 | 
							
								        public Transform followBody;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Header("Follow Settings")]
							 | 
						||
| 
								 | 
							
								        public float followStrength = 50f;
							 | 
						||
| 
								 | 
							
								        [Tooltip("The maximum allowed distance from the body for the headCamera to still move")]
							 | 
						||
| 
								 | 
							
								        //public float maxBodyDistance = 0.5f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        internal SphereCollider headCollider;
							 | 
						||
| 
								 | 
							
								        Vector3 startHeadPos;
							 | 
						||
| 
								 | 
							
								        bool started;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Transform _moveTo = null;
							 | 
						||
| 
								 | 
							
								        Transform moveTo {
							 | 
						||
| 
								 | 
							
								            get {
							 | 
						||
| 
								 | 
							
								                if(!gameObject.activeInHierarchy)
							 | 
						||
| 
								 | 
							
								                    return null;
							 | 
						||
| 
								 | 
							
								                if(_moveTo == null) {
							 | 
						||
| 
								 | 
							
								                    _moveTo = new GameObject().transform;
							 | 
						||
| 
								 | 
							
								                    _moveTo.transform.rotation = transform.rotation;
							 | 
						||
| 
								 | 
							
								                    _moveTo.rotation = transform.rotation;
							 | 
						||
| 
								 | 
							
								                    _moveTo.name = "HEAD FOLLOW POINT";
							 | 
						||
| 
								 | 
							
								                    _moveTo.parent = AutoHandExtensions.transformParent;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                return _moveTo;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        internal Rigidbody body;
							 | 
						||
| 
								 | 
							
								        CollisionTracker collisionTracker = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        internal void Init() {
							 | 
						||
| 
								 | 
							
								            if(collisionTracker == null) {
							 | 
						||
| 
								 | 
							
								                collisionTracker = gameObject.AddComponent<CollisionTracker>();
							 | 
						||
| 
								 | 
							
								                collisionTracker.disableTriggersTracking = true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            body = GetComponent<Rigidbody>();
							 | 
						||
| 
								 | 
							
								            gameObject.layer = LayerMask.NameToLayer(AutoHandPlayer.HandPlayerLayer);
							 | 
						||
| 
								 | 
							
								            transform.position = headCamera.transform.position;
							 | 
						||
| 
								 | 
							
								            transform.rotation = headCamera.transform.rotation;
							 | 
						||
| 
								 | 
							
								            headCollider = GetComponent<SphereCollider>();
							 | 
						||
| 
								 | 
							
								            startHeadPos = headCamera.transform.position;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected void FixedUpdate() {
							 | 
						||
| 
								 | 
							
								            moveTo.position = headCamera.transform.position;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(startHeadPos.y != headCamera.transform.position.y && !started) {
							 | 
						||
| 
								 | 
							
								                started = true;
							 | 
						||
| 
								 | 
							
								                body.position = headCamera.transform.position;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if(!started)
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            MoveTo();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public bool Started() {
							 | 
						||
| 
								 | 
							
								            return started;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        internal virtual void MoveTo() {
							 | 
						||
| 
								 | 
							
								            moveTo.position = headCamera.transform.position;
							 | 
						||
| 
								 | 
							
								            var movePos = moveTo.position;
							 | 
						||
| 
								 | 
							
								            var distance = Vector3.Distance(movePos, transform.position);
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            //Sets velocity linearly based on distance from hand
							 | 
						||
| 
								 | 
							
								            var vel = (movePos - transform.position).normalized * followStrength * distance;
							 | 
						||
| 
								 | 
							
								            body.velocity = vel;
							 | 
						||
| 
								 | 
							
								            lastUpdateTime = Time.realtimeSinceStartup;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        float lastUpdateTime;
							 | 
						||
| 
								 | 
							
								        protected virtual void Update() {
							 | 
						||
| 
								 | 
							
								            if(CollisionCount() == 0 && moveTo != null && !body.isKinematic) {
							 | 
						||
| 
								 | 
							
								                var deltaTime = (Time.realtimeSinceStartup - lastUpdateTime);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                MoveTo();
							 | 
						||
| 
								 | 
							
								                transform.position = Vector3.MoveTowards(transform.position, moveTo.position, body.velocity.magnitude * deltaTime);
							 | 
						||
| 
								 | 
							
								                body.velocity = Vector3.MoveTowards(body.velocity, Vector3.zero, body.velocity.magnitude * deltaTime);
							 | 
						||
| 
								 | 
							
								                body.position = transform.position;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            lastUpdateTime = Time.realtimeSinceStartup;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public int CollisionCount() {
							 | 
						||
| 
								 | 
							
								            return collisionTracker.collisionCount;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |