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