C# 使物体面向玩家移动

C# 使物体面向玩家移动,c#,unity3d,path-finding,C#,Unity3d,Path Finding,我正在为我的学校项目制作一个简单的2d飞船游戏。现在ai将面对玩家并跟随他们一定距离,然后当足够近时,旋转,以便它可以从船的每一侧向玩家开火。但根据我目前的密码,敌人将在靶场向玩家侧身移动,这显然是不应该发生的 那么我怎样才能使敌人只向前移动并保持与玩家垂直呢 这是我目前的代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScri

我正在为我的学校项目制作一个简单的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, playerq, Time.deltaTime * speed);
        }

    }
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类NewBehaviourScript:MonoBehavior
{
公众浮标速度、停止、后退、追逐范围、距离、射击范围;
//宣布玩家和敌人为转换,以恢复他们的位置
公共转换播放器;
void Start()
{
player=GameObject.FindGameObjectWithTag(“player”).GetComponent();
Chase_范围=14;
射程=10;
stopD=6;
d=4;
}
//每帧调用一次更新
无效更新()
{
//敌方和玩家位置之间的距离
距离=(向量2.距离(transform.position,player.position));
transform.position=Vector2.movetoward(transform.position、player.position、speed*Time.deltaTime);
如果(距离>停止D)
{
//如果距离大于停止距离,则向玩家移动
速度=10;
}
否则如果(距离<停止距离>后退)
{
速度=0;
}
否则如果(距离<后退)
{
//如果距离小于停止距离,请远离玩家(避免碰撞)
速度=-10;
}
如果(距离>追逐范围)
{ 
//必须使用vector3,因为vector2不适用于z轴
//计算位置向量的差值
Vector3 VectorTarget=player.position-transform.position;
//计算对象之间的角度并将结果转换为度
浮动角度=Mathf.Atan2(vectortarget.y,vectortarget.x)*Mathf.Rad2Deg;
//将角度转换为四元数,以便slerp可以使用该角度
四元数播放器Q=四元数角度轴(角度,矢量3向前);
transform.rotation=Quaternion.Slerp(transform.rotation,playerq,Time.deltaTime*速度);
}
中频(距离<发射距离)
{
浮动因子;
Vector3 VectorTarget=player.position-transform.position;
浮动角度=Mathf.Atan2(vectortarget.y,vectortarget.x)*Mathf.Rad2Deg;
如果(角度<0)
{
Rfactor=90;
}
否则,如果(角度>0)
{
Rfactor=-90;
}
四元数播放器Q=四元数角度轴(角度+R因子,矢量3向前);
transform.rotation=Quaternion.Slerp(transform.rotation,playerq,Time.deltaTime*速度);
}
}
别介意那些下流的评论,这是给学校的。
如果您对该代码有任何其他评论,我们将不胜感激。通过快速的谷歌搜索,我找到了以下答案:


使用此功能,您可以相对于玩家向前移动敌人。如果您现在旋转玩家,您将获得所需的结果:敌人将与玩家一起移动,但保持专注于玩家

通过快速谷歌搜索,我找到了以下答案:


使用此选项,您可以相对于玩家向前移动敌人。如果您现在旋转玩家,您将获得所需的结果:敌人将与玩家一起移动,但将注意力集中在玩家身上

您可能在错误的轴上使用了“向前”属性,但我真的不明白问题出在哪里,您能澄清一下吗?到目前为止的代码没有起作用如预期的那样,敌人旋转并向玩家移动一定距离,然后当它靠近时旋转,使其垂直于玩家。我现在需要做的是使敌人沿着玩家移动,以便他们可以继续射击。你能尝试将他的移动添加到你选择的轴上吗比如?你可能在错误的轴上使用了“向前”属性,但我真的不明白问题出在哪里,你能澄清一下吗?好吧,到目前为止,代码按预期运行,敌人旋转并向玩家移动一定距离,然后当它靠近时旋转,使其垂直于玩家。我现在需要做的是就是让敌人和玩家并驾齐驱,这样他们就可以继续开火。你能试着给他的移动添加一个你喜欢的偏移量吗?