89 lines
2.0 KiB
C#
89 lines
2.0 KiB
C#
using UnityEngine;
|
|
|
|
namespace ECM2.Walkthrough.Ex71
|
|
{
|
|
/// <summary>
|
|
/// This example shows how to implement a moving platform.
|
|
/// It will loop from its start position (ie: transform.position) to its target position
|
|
/// (ie: startPosition + offset) during moveTime seconds.
|
|
/// </summary>
|
|
|
|
[RequireComponent(typeof(Rigidbody))]
|
|
public class KinematicMove : MonoBehaviour
|
|
{
|
|
#region FIELDS
|
|
|
|
[SerializeField]
|
|
public float _moveTime = 3.0f;
|
|
|
|
[SerializeField]
|
|
private Vector3 _offset;
|
|
|
|
#endregion
|
|
|
|
#region PRIVATE FIELDS
|
|
|
|
private Rigidbody _rigidbody;
|
|
|
|
private Vector3 _startPosition;
|
|
private Vector3 _targetPosition;
|
|
|
|
#endregion
|
|
|
|
#region PROPERTIES
|
|
|
|
public float moveTime
|
|
{
|
|
get => _moveTime;
|
|
set => _moveTime = Mathf.Max(0.0001f, value);
|
|
}
|
|
|
|
public Vector3 offset
|
|
{
|
|
get => _offset;
|
|
set => _offset = value;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region METHODS
|
|
|
|
/// <summary>
|
|
/// Sinusoidal ease function.
|
|
/// </summary>
|
|
|
|
public static float EaseInOut(float time, float duration)
|
|
{
|
|
return -0.5f * (Mathf.Cos(Mathf.PI * time / duration) - 1.0f);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region MONOBEHAVIOUR
|
|
|
|
public void OnValidate()
|
|
{
|
|
moveTime = _moveTime;
|
|
}
|
|
|
|
public void Awake()
|
|
{
|
|
_rigidbody = GetComponent<Rigidbody>();
|
|
_rigidbody.isKinematic = true;
|
|
|
|
_startPosition = transform.position;
|
|
_targetPosition = _startPosition + offset;
|
|
}
|
|
|
|
public void FixedUpdate()
|
|
{
|
|
float t = EaseInOut(Mathf.PingPong(Time.time, _moveTime), _moveTime);
|
|
Vector3 p = Vector3.Lerp(_startPosition, _targetPosition, t);
|
|
|
|
_rigidbody.MovePosition(p);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|