Files
FueraDeEscala/Assets/Game Kit Controller/Scripts/Head Track/headTrackTarget.cs
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

289 lines
5.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class headTrackTarget : MonoBehaviour
{
[Header ("Main Settings")]
[Space]
public bool targetEnabled = true;
public Vector3 positionOffset;
public float minDistanceToLook = 4;
public targetVisibilityTypes visibilityTypes;
public List<string> tagsToLocate = new List<string> ();
public bool useCustomLayer;
public LayerMask customLayer;
public bool storeHeadTrackFound;
[Space]
[Header ("Debug")]
[Space]
public List<headTrack> headTrackFoundList = new List<headTrack> ();
[Space]
[Header ("Gizmo Settings")]
[Space]
public bool showGizmo;
public Color gizmoColor = Color.yellow;
[Space]
[Header ("Components")]
[Space]
public Transform targetToLook;
public Collider mainCollider;
public enum targetVisibilityTypes
{
None,
Raycast
}
headTrack currentHeadTrack;
LayerMask currentLayerMask;
Vector3 positionToLook;
RaycastHit hit;
bool targetToLookLocated;
bool targetLoLookChecked;
public Vector3 getLookPositon ()
{
if (!targetLoLookChecked) {
if (targetToLook != null) {
targetToLookLocated = true;
}
targetLoLookChecked = true;
}
if (targetToLookLocated) {
return targetToLook.position + positionOffset;
} else {
return transform.TransformPoint (positionOffset);
}
}
public bool lookTargetVisible (Vector3 headPosition, LayerMask layer)
{
if (!targetEnabled) {
return false;
}
positionToLook = getLookPositon ();
if (visibilityTypes == targetVisibilityTypes.None) {
if (GKC_Utils.distance (headPosition, positionToLook) > minDistanceToLook) {
return false;
} else {
return true;
}
} else if (visibilityTypes == targetVisibilityTypes.Raycast) {
if (GKC_Utils.distance (headPosition, positionToLook) > minDistanceToLook) {
return false;
} else {
if (useCustomLayer) {
currentLayerMask = customLayer;
} else {
currentLayerMask = layer;
}
if (Physics.Linecast (headPosition, positionToLook, out hit, currentLayerMask)) {
if (hit.transform != transform) {
if (showGizmo) {
drawLine (headPosition, hit.point, Color.red);
}
return false;
} else {
if (showGizmo) {
drawLine (headPosition, hit.point, Color.green);
}
return true;
}
} else {
if (showGizmo) {
drawLine (headPosition, positionToLook, Color.green);
}
return true;
}
}
}
return false;
}
public void drawLine (Vector3 startPosition, Vector3 endPosition, Color color)
{
if (showGizmo) {
Debug.DrawLine (startPosition, endPosition, color);
}
}
void OnTriggerEnter (Collider other)
{
checkTriggerInfo (other.gameObject, true);
}
void OnTriggerExit (Collider other)
{
checkTriggerInfo (other.gameObject, false);
}
void checkTriggerInfo (GameObject objectToCheck, bool isEnter)
{
if (tagsToLocate.Contains (objectToCheck.tag)) {
currentHeadTrack = objectToCheck.GetComponent<headTrack> ();
if (currentHeadTrack != null) {
if (!currentHeadTrack.isHeadTrackEnabled ()) {
return;
}
if (isEnter) {
currentHeadTrack.checkHeadTrackTarget (this);
if (storeHeadTrackFound) {
if (!headTrackFoundList.Contains (currentHeadTrack)) {
headTrackFoundList.Add (currentHeadTrack);
}
}
} else {
currentHeadTrack.removeHeadTrackTarget (this);
if (storeHeadTrackFound) {
if (headTrackFoundList.Contains (currentHeadTrack)) {
headTrackFoundList.Remove (currentHeadTrack);
}
}
}
}
}
}
public void setEnableState (bool state)
{
targetEnabled = state;
}
public void disableState ()
{
setEnableState (false);
}
public void addTagToLocate (string tagToAdd)
{
if (!tagsToLocate.Contains (tagToAdd)) {
tagsToLocate.Add (tagToAdd);
getMainCollider ();
if (mainCollider != null) {
mainCollider.enabled = false;
mainCollider.enabled = true;
}
}
}
public void removeTagToLocate (string tagToAdd)
{
if (tagsToLocate.Contains (tagToAdd)) {
if (storeHeadTrackFound) {
for (int i = headTrackFoundList.Count - 1; i >= 0; i--) {
if (headTrackFoundList [i].gameObject != null) {
if (headTrackFoundList [i].gameObject.CompareTag (tagToAdd)) {
headTrackFoundList [i].removeHeadTrackTarget (this);
headTrackFoundList.RemoveAt (i);
}
} else {
headTrackFoundList.RemoveAt (i);
}
}
}
tagsToLocate.Remove (tagToAdd);
}
}
public void removeAllHeadTracksFoundAndDisableHeadTrack ()
{
for (int i = 0; i < headTrackFoundList.Count; i++) {
headTrackFoundList [i].removeHeadTrackTarget (this);
}
headTrackFoundList.Clear ();
getMainCollider ();
if (mainCollider != null) {
mainCollider.enabled = false;
}
targetEnabled = false;
}
public void enableHeadTrack ()
{
targetEnabled = true;
getMainCollider ();
if (mainCollider != null) {
mainCollider.enabled = true;
}
}
void getMainCollider ()
{
if (mainCollider == null) {
mainCollider = GetComponent<Collider> ();
}
}
#if UNITY_EDITOR
void OnDrawGizmos ()
{
if (!showGizmo) {
return;
}
if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) {
DrawGizmos ();
}
}
void OnDrawGizmosSelected ()
{
DrawGizmos ();
}
void DrawGizmos ()
{
if (showGizmo && targetEnabled) {
Gizmos.color = gizmoColor;
Vector3 position = getLookPositon ();
Gizmos.DrawWireSphere (position, minDistanceToLook);
Gizmos.color = Color.red;
Gizmos.DrawSphere (position, 0.2f);
}
}
#endif
}