65 lines
1.6 KiB
C#
65 lines
1.6 KiB
C#
using UnityEngine;
|
|
|
|
namespace PolyPerfect
|
|
{
|
|
public class SurfaceRotation : MonoBehaviour
|
|
{
|
|
private string terrainLayer = "Terrain";
|
|
private int layer;
|
|
private bool rotate = true;
|
|
private Quaternion targetRotation;
|
|
private float rotationSpeed = 2f;
|
|
|
|
private void Awake()
|
|
{
|
|
layer = LayerMask.GetMask(terrainLayer);
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
RaycastHit hit;
|
|
Vector3 direction = transform.parent.TransformDirection(Vector3.down);
|
|
|
|
if (Physics.Raycast(transform.parent.position, direction, out hit, 50f, layer))
|
|
{
|
|
float distance = hit.distance;
|
|
Quaternion surfaceRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
|
|
transform.rotation = surfaceRotation * transform.parent.rotation;
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!rotate)
|
|
return;
|
|
|
|
RaycastHit hit;
|
|
Vector3 direction = transform.parent.TransformDirection(Vector3.down);
|
|
|
|
if (Physics.Raycast(transform.parent.position, direction, out hit, 50f, layer))
|
|
{
|
|
float distance = hit.distance;
|
|
Quaternion surfaceRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
|
|
targetRotation = surfaceRotation * transform.parent.rotation;
|
|
}
|
|
|
|
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed);
|
|
}
|
|
|
|
public void SetRotationSpeed(float speed)
|
|
{
|
|
if (speed > 0f)
|
|
rotationSpeed = speed;
|
|
}
|
|
|
|
private void OnBecameVisible()
|
|
{
|
|
rotate = true;
|
|
}
|
|
|
|
private void OnBecameInvisible()
|
|
{
|
|
rotate = false;
|
|
}
|
|
}
|
|
} |