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