我正在2D Unity游戏中成为敌人,而我试图在精灵面对相反方向时翻转它,事实是,只有当玩家离敌人非常近时,精灵才会翻转。这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyMovement : MonoBehaviour
{
public float moveSpeed;
private PlayerMovement player;
public float playerRange;
public LayerMask playerLayer;
public bool playerinRange;
private bool Right = false;
private void Start()
{
player = FindObjectOfType<PlayerMovement>();
}
private void Update()
{
playerinRange = Physics2D.OverlapCircle(transform.position, playerRange, playerLayer);
if (playerinRange)
{
transform.position = Vector3.MoveTowards(transform.position, player.transform.position, moveSpeed * Time.deltaTime);
}
Flip();
}
private void OnDrawGizmosSelected()
{
Gizmos.DrawSphere(transform.position, playerRange);
}
private void Flip()
{
if (transform.position.x > 0 && !Right || transform.position.x < 0 && Right)
{
Right = !Right;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
}
答案 0 :(得分:2)
查看您的代码,实际上是敌人所面对的方向取决于敌人在世界上的位置(因为您使用的是transform.position的x分量)。如果您的敌人x位置为正,则Right布尔值将为true,否则为false(也不会考虑0的情况)。
由于在此代码段中唯一能够移动敌人的是Vector3.MoveToward,当玩家处于范围内时,我怀疑发生的情况是当玩家靠近时,敌人移动并且x位置值从从负到正(或相反),翻转精灵。
现在,不需要将精灵方向链接到敌人的位置。相反,您希望敌人面对其前进的方向。这可以通过使用一个速度参数来完成,该速度参数用于移动敌人,例如可以告诉您敌人的移动方向(以及速度)。如果要继续前进,则需要弄清楚它朝着哪个方向移动,并相应地翻转精灵。这是基于您的代码的代码示例:
private void Update()
{
playerinRange = Physics2D.OverlapCircle(transform.position, playerRange, playerLayer);
if (playerinRange)
{
transform.position = Vector3.MoveTowards(transform.position, player.transform.position, moveSpeed * Time.deltaTime);
Flip(player.transform.position.x - transform.position.x);
}
}
private void Flip(float direction)
{
Right = (direction >= 0);
Vector3 theScale = transform.localScale;
theScale.x = Mathf.Abs(theScale.x) * Mathf.Sign(direction);
transform.localScale = theScale;
}