2025-03-18 22:32:00 +08:00
|
|
|
|
using System;
|
2025-03-17 21:56:02 +08:00
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
public class RedGhost : MonoBehaviour
|
|
|
|
|
{
|
2025-03-18 22:32:00 +08:00
|
|
|
|
// ========== ״̬ö<CCAC><C3B6> ==========
|
|
|
|
|
public enum GhostState
|
2025-03-17 21:56:02 +08:00
|
|
|
|
{
|
2025-03-18 22:32:00 +08:00
|
|
|
|
Idle, //<2F><><EFBFBD>ֵĴ<D6B5><C4B4><EFBFBD>
|
|
|
|
|
Start, //<2F>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
Chase, // <><D7B7>ģʽ
|
|
|
|
|
Frightened, // <20>־<EFBFBD>ģʽ,<2C><><EFBFBD><EFBFBD>
|
|
|
|
|
Die // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-03-17 21:56:02 +08:00
|
|
|
|
}
|
2025-03-18 22:32:00 +08:00
|
|
|
|
public GhostState curstate;//<2F><>ǰö<C7B0><C3B6>
|
2025-03-17 21:56:02 +08:00
|
|
|
|
|
2025-03-18 22:32:00 +08:00
|
|
|
|
[Header("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")]
|
|
|
|
|
public Rigidbody2D rb;
|
|
|
|
|
public Animator anim;
|
|
|
|
|
public GameObject pacMan;//<2F>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
public LayerMask obstadeLayer;//ǽ<>IJ㼶
|
|
|
|
|
|
|
|
|
|
[Header("<><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>")]
|
|
|
|
|
private Vector2 currentDirection;
|
|
|
|
|
|
|
|
|
|
public float speed;//<2F><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
|
|
|
|
public float frightenedSpeed;//<2F><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
private void Awake()
|
|
|
|
|
{
|
|
|
|
|
rb = GetComponent<Rigidbody2D>();
|
|
|
|
|
// anim = GetComponent<Animator>();
|
|
|
|
|
pacMan = GameObject.Find("PacManPlayer");//<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Update()
|
|
|
|
|
{
|
|
|
|
|
switch (curstate)
|
|
|
|
|
{
|
|
|
|
|
case GhostState.Idle:
|
|
|
|
|
Idle();
|
|
|
|
|
break;
|
|
|
|
|
case GhostState.Start:
|
|
|
|
|
GhostStart();
|
|
|
|
|
break;
|
|
|
|
|
case GhostState.Chase:
|
|
|
|
|
Chase();
|
|
|
|
|
break;
|
|
|
|
|
case GhostState.Frightened:
|
|
|
|
|
Frightened();
|
|
|
|
|
break;
|
|
|
|
|
case GhostState.Die:
|
|
|
|
|
Die();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void Idle()
|
|
|
|
|
{
|
|
|
|
|
curstate = GhostState.Chase;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void GhostStart()
|
|
|
|
|
{
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void Chase()
|
2025-03-17 21:56:02 +08:00
|
|
|
|
{
|
2025-03-18 22:32:00 +08:00
|
|
|
|
UpdateMovement(pacMan.transform.position, true);
|
|
|
|
|
//anim.SetBool("Frightened", false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Frightened()
|
|
|
|
|
{
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Die()
|
|
|
|
|
{
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><DFBC><EFBFBD><EFBFBD><D7B7>/<2F><><EFBFBD>ܹ<EFBFBD><DCB9>ã<EFBFBD>
|
|
|
|
|
private void UpdateMovement(Vector2 targetPos, bool isChasing)
|
|
|
|
|
{
|
|
|
|
|
Vector2[] directions = { Vector2.up, Vector2.down, Vector2.left, Vector2.right };
|
|
|
|
|
Vector2 bestDir = Vector2.zero;
|
|
|
|
|
float bestValue = isChasing ? Mathf.Infinity : -Mathf.Infinity;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3A3ACB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
foreach (Vector2 dir in directions)
|
|
|
|
|
{
|
|
|
|
|
if (dir == -currentDirection) continue; // ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><F2A3ACBC><EFBFBD>ִ<EFBFBD>У<EFBFBD><D0A3><EFBFBD>ֱֹ<D6B9>ӻ<EFBFBD>ͷ
|
|
|
|
|
|
|
|
|
|
RaycastHit2D hit = Physics2D.Raycast(transform.position, dir, 1f, obstadeLayer);//<2F><>ʼ<EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><F2A3ACB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (hit.collider != null) continue;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>㷽<EFBFBD><E3B7BD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
float distance = Vector2.Distance(rb.position + dir, targetPos);//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>ֵ
|
|
|
|
|
float currentValue = isChasing ? distance : -distance;//<2F><><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
if ((isChasing && currentValue < bestValue) || (!isChasing && currentValue > bestValue))
|
|
|
|
|
{
|
|
|
|
|
bestValue = currentValue;
|
|
|
|
|
bestDir = dir;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bestDir != Vector2.zero)
|
|
|
|
|
{
|
|
|
|
|
currentDirection = bestDir;
|
|
|
|
|
rb.velocity = currentDirection * (curstate == GhostState.Frightened ? frightenedSpeed : speed);
|
|
|
|
|
//anim.SetFloat("DirX", currentDirection.x);
|
|
|
|
|
//anim.SetFloat("DirY", currentDirection.y);
|
|
|
|
|
}
|
2025-03-17 21:56:02 +08:00
|
|
|
|
}
|
|
|
|
|
}
|