88 lines
2.7 KiB
C#
88 lines
2.7 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
public class SlimeWalk : MonoBehaviour
|
|
{
|
|
[SerializeField] float moveSpeed = 3f;
|
|
[SerializeField] float jumpHeight = 1f;
|
|
[SerializeField] float jumpDuration = 0.4f;
|
|
[SerializeField] Animator animator;
|
|
|
|
static readonly int UpHash = Animator.StringToHash("Up");
|
|
static readonly int DownHash = Animator.StringToHash("Down");
|
|
static readonly int LeftHash = Animator.StringToHash("Left");
|
|
static readonly int RightHash = Animator.StringToHash("Right");
|
|
static readonly int IdleHash = Animator.StringToHash("Idle");
|
|
static readonly int JumpHash = Animator.StringToHash("Jump");
|
|
|
|
enum Dir { Idle, Up, Down, Left, Right }
|
|
Dir lastDir = Dir.Idle;
|
|
float jumpOffset;
|
|
bool isJumping;
|
|
|
|
void Awake()
|
|
{
|
|
if (animator == null) animator = GetComponent<Animator>();
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
float x = 0f;
|
|
float y = 0f;
|
|
if (Input.GetKey(KeyCode.A)) x -= 1f;
|
|
if (Input.GetKey(KeyCode.D)) x += 1f;
|
|
if (Input.GetKey(KeyCode.W)) y += 1f;
|
|
if (Input.GetKey(KeyCode.S)) y -= 1f;
|
|
|
|
Vector3 move = new Vector3(x, y, 0f);
|
|
if (move.sqrMagnitude > 1f) move.Normalize();
|
|
transform.position += move * moveSpeed * Time.deltaTime;
|
|
|
|
UpdateAnimation(x, y);
|
|
|
|
if (Input.GetKeyDown(KeyCode.Space) && !isJumping)
|
|
{
|
|
if (animator != null) animator.SetTrigger(JumpHash);
|
|
StartCoroutine(Jump());
|
|
}
|
|
}
|
|
|
|
void UpdateAnimation(float x, float y)
|
|
{
|
|
if (animator == null) return;
|
|
Dir newDir;
|
|
if (x == 0f && y == 0f) newDir = Dir.Idle;
|
|
else if (Mathf.Abs(x) >= Mathf.Abs(y)) newDir = x > 0f ? Dir.Right : Dir.Left;
|
|
else newDir = y > 0f ? Dir.Up : Dir.Down;
|
|
|
|
if (newDir == lastDir) return;
|
|
lastDir = newDir;
|
|
switch (newDir)
|
|
{
|
|
case Dir.Up: animator.SetTrigger(UpHash); break;
|
|
case Dir.Down: animator.SetTrigger(DownHash); break;
|
|
case Dir.Left: animator.SetTrigger(LeftHash); break;
|
|
case Dir.Right: animator.SetTrigger(RightHash); break;
|
|
default: animator.SetTrigger(IdleHash); break;
|
|
}
|
|
}
|
|
|
|
IEnumerator Jump()
|
|
{
|
|
isJumping = true;
|
|
float t = 0f;
|
|
while (t < jumpDuration)
|
|
{
|
|
t += Time.deltaTime;
|
|
float n = Mathf.Clamp01(t / jumpDuration);
|
|
float newOffset = 4f * jumpHeight * n * (1f - n);
|
|
transform.position += new Vector3(0f, newOffset - jumpOffset, 0f);
|
|
jumpOffset = newOffset;
|
|
yield return null;
|
|
}
|
|
transform.position -= new Vector3(0f, jumpOffset, 0f);
|
|
jumpOffset = 0f;
|
|
isJumping = false;
|
|
}
|
|
}
|