add ckg
plantilla base para movimiento básico
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class portableWalkOnBalanceTriggerSystem : MonoBehaviour
|
||||
{
|
||||
[Header ("Main Settings")]
|
||||
[Space]
|
||||
|
||||
public LayerMask raycastLayermask;
|
||||
|
||||
public float maxRaycastDistance;
|
||||
|
||||
public bool adjustEndToAnyDistance;
|
||||
|
||||
public bool activateOnStart;
|
||||
|
||||
[Space]
|
||||
[Header ("Other Settings")]
|
||||
[Space]
|
||||
|
||||
public bool checkSurfaceLayer;
|
||||
public LayerMask layerSurface;
|
||||
public float raycastRadius;
|
||||
public bool destroyObjectIfSurfaceNotFound;
|
||||
|
||||
public bool checkSurfaceInclination;
|
||||
public float minSurfaceInclination;
|
||||
|
||||
[Space]
|
||||
[Header ("Debug")]
|
||||
[Space]
|
||||
|
||||
public bool showDebugPrint;
|
||||
|
||||
[Space]
|
||||
[Header ("Components")]
|
||||
[Space]
|
||||
|
||||
public Transform pivotTransform;
|
||||
|
||||
public Transform startTransform;
|
||||
public Transform endTransform;
|
||||
|
||||
RaycastHit hit;
|
||||
|
||||
void Start ()
|
||||
{
|
||||
if (activateOnStart) {
|
||||
activateWalkOnBalanceTrigger ();
|
||||
}
|
||||
}
|
||||
|
||||
public void activateWalkOnBalanceTrigger ()
|
||||
{
|
||||
if (checkSurfaceLayer) {
|
||||
Collider[] hits = Physics.OverlapSphere (transform.position, raycastRadius);
|
||||
|
||||
if (hits.Length <= 0) {
|
||||
if (destroyObjectIfSurfaceNotFound) {
|
||||
if (showDebugPrint) {
|
||||
print ("No surface found on portacle walk on balance trigger system, destroy object");
|
||||
}
|
||||
|
||||
Destroy (gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
if (checkSurfaceInclination) {
|
||||
Vector3 rayPosition = transform.position;
|
||||
|
||||
for (int i = 0; i < hits.Length; i++) {
|
||||
Vector3 heading = hits [i].transform.position - rayPosition;
|
||||
|
||||
float distance = heading.magnitude;
|
||||
|
||||
Vector3 rayDirection = heading / distance;
|
||||
|
||||
if (Physics.Raycast (rayPosition, rayDirection, out hit, distance + 1, raycastLayermask)) {
|
||||
|
||||
float hitAngle = Vector3.Angle (Vector3.up, hit.normal);
|
||||
|
||||
if (showDebugPrint) {
|
||||
print ("Angle with surface found of " + hitAngle + " degrees");
|
||||
}
|
||||
|
||||
if (Mathf.Abs (hitAngle) < minSurfaceInclination) {
|
||||
|
||||
if (showDebugPrint) {
|
||||
print ("Surface angle not possible for portacle walk on balance trigger system, destroy object");
|
||||
}
|
||||
|
||||
Destroy (gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Vector3 raycastPosition = transform.position;
|
||||
|
||||
Vector3 raycastDirection = transform.forward;
|
||||
|
||||
float raycastDistance = maxRaycastDistance;
|
||||
|
||||
if (Physics.Raycast (raycastPosition, raycastDirection, out hit, raycastDistance, raycastLayermask)) {
|
||||
transform.rotation = Quaternion.LookRotation (hit.normal);
|
||||
|
||||
transform.position = hit.point + hit.normal * 0.1f;
|
||||
|
||||
transform.eulerAngles = new Vector3 (0, transform.eulerAngles.y, 0);
|
||||
} else {
|
||||
Collider[] hits = Physics.OverlapSphere (transform.position, raycastRadius);
|
||||
|
||||
bool surfaceLocated = false;
|
||||
|
||||
Vector3 rayPosition = transform.position;
|
||||
|
||||
for (int i = 0; i < hits.Length; i++) {
|
||||
if (!surfaceLocated) {
|
||||
Vector3 heading = hits [i].transform.position - rayPosition;
|
||||
|
||||
float distance = heading.magnitude;
|
||||
|
||||
Vector3 rayDirection = heading / distance;
|
||||
|
||||
if (Physics.Raycast (rayPosition, rayDirection, out hit, distance + 1, raycastLayermask)) {
|
||||
transform.rotation = Quaternion.LookRotation (hit.normal);
|
||||
|
||||
transform.position = hit.point + hit.normal * 0.1f;
|
||||
|
||||
surfaceLocated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
raycastDirection = transform.forward;
|
||||
|
||||
raycastPosition = transform.position;
|
||||
|
||||
if (adjustEndToAnyDistance) {
|
||||
raycastDistance = Mathf.Infinity;
|
||||
}
|
||||
|
||||
Vector3 targetPosition = transform.position;
|
||||
|
||||
if (Physics.Raycast (raycastPosition, raycastDirection, out hit, raycastDistance, raycastLayermask)) {
|
||||
targetPosition = hit.point;
|
||||
} else {
|
||||
targetPosition += transform.forward * maxRaycastDistance;
|
||||
}
|
||||
|
||||
startTransform.position = transform.position;
|
||||
|
||||
endTransform.position = targetPosition;
|
||||
|
||||
float scaleZ = GKC_Utils.distance (startTransform.position, endTransform.position);
|
||||
|
||||
float finalScaleValue = scaleZ + (scaleZ * 0.01f) + 0.5f;
|
||||
|
||||
pivotTransform.localScale = new Vector3 (1, 1, finalScaleValue);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user