我有一个问题与敌人。 我想在玩家站在敌人的背后时,敌人保持原来的位置,直到玩家从他的肩膀范围离开,始终循环播放向后走的动画(如驱逐)的问题是,当玩家进入肩膀范围时,敌人就会转身,所以动画会从头开始。此外,当玩家离开敌人的肩膀范围,并开始循环播放向后走的动画时,敌人就会转身,不能正确跟随玩家的位置,所以他的身体会面向相反的方向,脸部也不会面向玩家(比如说,身体一样)。
如果需要一些视频,我可以上传它们。
代码:
public void StartWalkRandom()
{
//ghostStateMachine.ChangeState(GhostState.Walking);
int walkingType = 0;
// Se il fantasma è vicino a un muro, cambia la camminata
if (IsNearWall(1f) && Random.value < 0.4f)
{
walkingType = 1;
}
Debug.Log($"Trying to start walk. canWalk={ghostAnimation.canWalk}, isWalking={ghostAnimation.isWalking}, IsBusy={ghostAnimation.IsBusy}");
ghostAnimation.StartWalkSequence(walkingType);
}
private bool IsNearWall(float distance)
{
RaycastHit hit;
Vector3 origin = transform.position + Vector3.up * 0.5f;
if (Physics.Raycast(origin, transform.forward, out hit, distance))
{
if (hit.collider.CompareTag("Wall"))
{
return true;
}
}
return false;
}
// --- Segui il player ---
public void HandlePlayerFollow()
{
if (player == null) return;
Vector3 toPlayer = (player.position - transform.position).normalized;
float distanceToPlayer = Vector3.Distance(transform.position, player.position);
float dot = Vector3.Dot(transform.forward, toPlayer);
if (distanceToPlayer > followDistance)
{
// Player troppo lontano → torna a patrol
isFollowingPlayer = false;
isAttacking = false;
ghostStateMachine.GoToNextPatrol();
return;
}
isFollowingPlayer = true;
if (distanceToPlayer <= ghostAttack.attackDistance)
{
// Player vicino → attacco
if (!isAttacking)
{
isAttacking = true;
agent.isStopped = true;
ghostAttack.AttackPlayer();
}
}
else
{
// Insegui il player
isAttacking = false;
agent.isStopped = false;
if (dot < -0.5f)
{
// Player dietro → camminata all'indietro
ghostAnimation.TriggerWalkBack();
agent.isStopped = true; // Fermiamo il movimento del NavMeshAgent
agent.updatePosition = false; // Non aggiorniamo la posizione tramite NavMeshAgent
agent.updateRotation = false; // Disabilitiamo anche la rotazione automatica dell'agent
Vector3 lookDirection = (player.position - transform.position).normalized;
lookDirection.y = 0; // mantieni il piano orizzontale
if (lookDirection != Vector3.zero)
{
Quaternion targetRotation = Quaternion.LookRotation(lookDirection);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);
}
// Muoviti all’indietro (gambe crab walk)
if (ghostAnimation.isWalking)
{
float backwardSpeed = agent.speed * Time.deltaTime;
transform.position += -transform.forward * backwardSpeed; // Muoviamo indietro
// Manteniamo la rotazione
if (lookDirection != Vector3.zero)
{
Quaternion targetRotation = Quaternion.LookRotation(lookDirection);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);
}
}
}
else
{
// Player davanti → camminata normale
ghostAnimation.StartWalkSequence(0); // tipo di camminata normale
agent.updateRotation = true;
agent.SetDestination(player.position);
}
}
}
评论 (0)