使物体面对并移向玩家

问题描述

我正在为我的学校项目制作一个简单的2D飞船游戏。现在,ai将面对玩家并跟随他们一定距离,然后在足够接近时旋转以使其可以从飞船的两侧向玩家射击。但是使用我当前的代码,敌人将在射击距离内向玩家侧身移动,这显然是不应该发生的。

所以我该如何使敌人只向前移动并保持垂直于玩家。

这是我当前的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehavIoUrScript : MonoBehavIoUr
{
    public float speed,stopD,retreatD,Chase_range,distance,firing_range;
    // declare player and enemy as transform to retrieve their positions
    public Transform player;

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();

        Chase_range = 14;
        firing_range = 10;
        stopD = 6;
        retreatD = 4;

    }
    // Update is called once per frame
    void Update()
    {

        // distance between the enemy and player positions
        distance = (Vector2.distance(transform.position,player.position));
        transform.position = Vector2.Movetowards(transform.position,player.position,speed * Time.deltaTime);

        if (distance > stopD)
        {
            // move towards the player if the distance is greater than stop distance
            speed = 10;

        }
        else if (distance < stopD & distance > retreatD)
        {
            speed = 0;
        }
        else if (distance < retreatD)
        {
            // move away from the player if the distance is less than stop distance (avoid collision)
            speed = -10;
        }

        if (distance > Chase_range)
        { 
         // have to use vector3 since vector2 does not work with the z axis
         // calculate the difference in the position vectors
         Vector3 vectorToTarget = player.position - transform.position;
            // Calculate the angle between the objects and convert the result to degrees
         float angle = Mathf.atan2(vectorToTarget.y,vectorToTarget.x) * Mathf.Rad2Deg;
            // convert the angle into a quaternion so that it can be used by slerp 
         Quaternion playerq = Quaternion.AngleAxis(angle,Vector3.forward);

         transform.rotation = Quaternion.Slerp(transform.rotation,playerq,Time.deltaTime * speed);      
        }
        if (distance < firing_range)
        {
            float Rfactor;
            Vector3 vectorToTarget = player.position - transform.position;

            float angle = Mathf.atan2(vectorToTarget.y,vectorToTarget.x) * Mathf.Rad2Deg;
            if (angle < 0) 
            {
                Rfactor = 90;
            }
            else if (angle > 0)
            {
                Rfactor = -90;
            }
                Quaternion playerq = Quaternion.AngleAxis(angle + Rfactor,Vector3.forward);
            
            transform.rotation = Quaternion.Slerp(transform.rotation,Time.deltaTime * speed);
        }

    }

不要介意那些卑鄙的评论,它是针对学校的。 关于该代码的任何其他注释也将不胜感激

解决方法

通过快速搜索,我找到了这个答案:

https://answers.unity.com/questions/1125044/how-do-i-move-an-object-relative-to-another-object.html

使用它可以使敌人相对于玩家向前移动。如果现在旋转播放器,您将获得理想的结果:敌人将与播放器一起移动,但始终专注于它