В идеале вы должны использовать пакет, такой как LeanTween , для обработки ваших переходов / анимаций, по крайней мере, в простых, мелкомасштабных случаях, подобных этому.
По сути, процессэто:
On Start:
store 'starting' position
On Enabled:
Run DoHover
On DoHover:
Pick random offset within radius (Random.insideUnitCircle() * radius)
LeanTween current transform to startingPos + offset over timeDelay
Set LeanTween.OnComplete to run DoHover
Если вы решили не использовать сторонний пакет для управления анимацией движения, вы можете попробовать это (я использую 3D-сцены, но вы должны иметь возможность сгладить еголегко):
private const float threshold = 0.02f;
private Vector3 startingPos;
private Vector3 destinationPos;
private Vector3 velocity;
public float radius = 0.1f;
public float minTimeDelay = 0.1f;
public float maxTimeDelay = 0.3f;
private void Start() {
startingPos = destinationPos = transform.position;
}
// This is a 'physics' frame update
public void FixedUpdate() {
if ( Vector3.Distance(transform.position, destinationPos) < threshold ) {
// Pick new destination and speed
destinationPos = startingPos + Random.insideUnitSphere * radius;
velocity = (destinationPos - transform.position) / Random.Range(minTimeDelay, maxTimeDelay);
}
// Move toward destination
transform.position += velocity * Time.fixedDeltaTime;
}