我的精灵只有在靠近玩家时才会翻转

时间:2019-12-30 12:00:50

标签: c# unity3d

我正在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;
        }
    }
}

1 个答案:

答案 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;
}