【问题标题】:Unity 2D rotate the AI enemy to look at playerUnity 2D 旋转 AI 敌人看玩家
【发布时间】:2018-11-26 20:25:19
【问题描述】:

我正在制作一个左右两侧的 2D 游戏,因此玩家只能向左或向右移动或跳跃。我做了一个AI作为敌人。人工智能工作正常。他可以去找玩家杀死他。

问题是敌人在杀死玩家时无法旋转或面对玩家。我想让 AI 看着玩家。当玩家在敌人的左边时,敌人应该旋转到左边看玩家。我搜索了许多网站,但没有得到任何正确的解决方案。这是我的敌人脚本:

public class enemy : MonoBehaviour
{
    public float speed;
    private Animator animvar;
    private Transform target;
    public GameObject effect;
    public float distance;
    private bool movingRight = true;
    public Transform groundedDetection;
    public float moveInput;
    public bool facingRight = true;

    void Start()
    {
        animvar = GetComponent<Animator>();
        target = GameObject.FindGameObjectWithTag("Player").transform;
    }

    // Update is called once per frame
    void Update()
    {
        if (Vector3.Distance(target.position, transform.position) < 20)
        {
            transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
        }
        else
        {
            transform.Translate(Vector2.right * speed * Time.deltaTime);
        }
        RaycastHit2D groundInfo = Physics2D.Raycast(groundedDetection.position, Vector2.down, distance);
    }

    void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.tag.Equals("danger"))
        {
            Instantiate(effect, transform.position, Quaternion.identity);
            Destroy(gameObject);
        }
        if (col.gameObject.tag.Equals("Player"))
        {
            Instantiate(effect, transform.position, Quaternion.identity);
            Destroy(gameObject);
        }
    }
}

游戏是 2D,左,右,使用 Unity3D 跳跃。

【问题讨论】:

  • 一个清晰明确的问题会有所帮助!

标签: c# unity3d 2d


【解决方案1】:

你需要一个可以翻转你的精灵的函数,你可以通过改变变换的比例来做到这一点,并保持一个布尔值来检查它面对的地方 bool facingRight;,所以是这样的

void Flip(){
      Vector3 scale = transform.localScale;
      scale.x *= -1;
      transform.localScale = scale;
      facingRight = !facingRight;
}

并在您的Update 中检查是否需要翻转

if (Vector3.Distance(target.position,transform.position)<20)
    {

     transform.position=Vector2.MoveTowards(transform.position, target.position,speed*Time.deltaTime);
     if(target.position.x > transform.position.x && !facingRight) //if the target is to the right of enemy and the enemy is not facing right
        Flip();
     if(target.position.x < transform.position.x && facingRight)
        Flip();
   }

【讨论】:

    【解决方案2】:

    很简单,只需获取 Player x 位置并与 Enemy 的 x 位置进行比较,然后相应地翻转敌人 sprite

    这是我的 Enemy 脚本中的 Update() 方法。这可以处理敌人的移动和改变精灵面对的方向:

    if (moveRight )
            {
                transform.Translate(2 * Time.deltaTime * moveSpeed, 0, 0);
                transform.localScale = new Vector2(6, 6); //6,6 is just a size that suits my sprite
                
            }
    
            else if (!moveRight)
            {
                transform.Translate(-2 * Time.deltaTime * moveSpeed, 0, 0);
                transform.localScale = new Vector2(-6, 6);
                
            }
    

    这是我的敌人 Attack() 方法,我将 Player X 位置与 Enemy X 位置进行比较。如果玩家 X 小于(在敌人左侧),我将敌人精灵翻转为负数

                if (transform.position.x > Player.position.x)
                {
                    transform.localScale = new Vector2(-6, 6);
                }
                else if (transform.position.x < Player.position.x)
                {
                    transform.localScale = new Vector2(6, 6);
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      相关资源
      最近更新 更多