Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 敌人的旋转运动应该攻击玩家,但不应该这样做?_C#_Unity3d - Fatal编程技术网

C# 敌人的旋转运动应该攻击玩家,但不应该这样做?

C# 敌人的旋转运动应该攻击玩家,但不应该这样做?,c#,unity3d,C#,Unity3d,基本原理 敌区 任何反馈都是受欢迎的,我试图让我添加到游戏中的敌人朝着玩家群移动,好像要依附和跟随,一旦我可以完成这个动作,我会让他们向玩家群射击。现在我添加的所有新敌人都在快速旋转。我没有语法错误 Update函数中肯定有可疑之处,因为您在条件中赋值=而不是检查等式== 你的意思是不是真的 如果这样做没有帮助,请在触发器enter/exit函数中添加一些Debug.Log语句,以查看何时调用它们 编辑 好吧,我看了看旋转。如果你想让敌人跟随玩家直到它进入攻击范围,那么你的旋转和平移都是错误的

基本原理

敌区


任何反馈都是受欢迎的,我试图让我添加到游戏中的敌人朝着玩家群移动,好像要依附和跟随,一旦我可以完成这个动作,我会让他们向玩家群射击。现在我添加的所有新敌人都在快速旋转。我没有语法错误

Update函数中肯定有可疑之处,因为您在条件中赋值=而不是检查等式==

你的意思是不是真的

如果这样做没有帮助,请在触发器enter/exit函数中添加一些Debug.Log语句,以查看何时调用它们

编辑 好吧,我看了看旋转。如果你想让敌人跟随玩家直到它进入攻击范围,那么你的旋转和平移都是错误的

旋转 这样做,它使敌人转向你想要的玩家,第二条线使敌人每帧逆时针旋转90°。如果你不想让敌人旋转,你就不需要线。 只需保留“查看”功能

翻译 翻译的问题是你在X轴的方向上移动——这不是玩家的方向。您应该首先计算方向向量并沿其平移

其要点始终是:

// normalized, so the vector affects only direction, not speed
Vector3 direction = (FROM.position - TO.position).normalized;
因此,有:

Vector3 enemyToTargetDirection = (target.position - transform.position).normalized;
enemyToTargetDirection.y = 0; // stay in the same height
transform.Translate(enemyToTargetDirection * speed * Time.deltaTime);
你可以这样做,但我认为当敌人逐渐向你旋转时,它看起来会更好,而不仅仅是朝你的方向“猛击”。 在这种情况下,生成的函数如下所示:

public void MoveToPlayer()
{
    Vector3 upwardsAxis = Vector3.up;

    float distanceToPlayer = Vector3.Distance(transform.position, target.position);
    if (distanceToPlayer > attack1Range)
    {
        float step = Time.deltaTime * speed;
        Vector3 lookDirection = target.position - transform.position;
        if (lookDirection != Vector3.zero) // Prevents rotation errors
        {
            // Rotate over time
            Quaternion lookRotation = Quaternion.LookRotation(lookDirection, upwardsAxis);
            transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, step * 2);
        }
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);
    }
}

哦,顺便说一句,对于一般的运动/旋转/物理,你应该使用FixedUpdate而不是常规更新。它使运动更流畅,如果“唤醒”、“开始”、“更新”方法为空,则不要保持“唤醒”、“开始”、“更新”方法,因为这可能会稍微影响性能。

我认为这与注视有关,旋转和平移组合。。。也许你应该检查一下,我想这是因为你的变换;你为什么需要它?我不需要我添加的敌人,如果我改变转换的值,他们现在的旋转方式。轮换这能帮我让他们朝着球员的方向前进吗?我会按照时间表前进。谢谢大家谢谢你的回复,我将对此进行调查。嗨,Rallix,我在我添加的敌人上方进行了更改停止旋转并停留在我放置它们的位置。我应该将转换设置为旋转什么值,或者这些值是否良好?嗨;我测试了你的代码,并尝试进行了一些修复,看看答案中是否有帮助。嗨,Rallix,我走了另一条路,我去了我的时间线,让玩家的移动陷入另一个问题,不过我会稍后发布。
// Rotate to look at player
transform.LookAt(target.position);
transform.Rotate(new Vector3(0, -90, 0), Space.Self);  
// normalized, so the vector affects only direction, not speed
Vector3 direction = (FROM.position - TO.position).normalized;
Vector3 enemyToTargetDirection = (target.position - transform.position).normalized;
enemyToTargetDirection.y = 0; // stay in the same height
transform.Translate(enemyToTargetDirection * speed * Time.deltaTime);
public void MoveToPlayer()
{
    Vector3 upwardsAxis = Vector3.up;

    float distanceToPlayer = Vector3.Distance(transform.position, target.position);
    if (distanceToPlayer > attack1Range)
    {
        float step = Time.deltaTime * speed;
        Vector3 lookDirection = target.position - transform.position;
        if (lookDirection != Vector3.zero) // Prevents rotation errors
        {
            // Rotate over time
            Quaternion lookRotation = Quaternion.LookRotation(lookDirection, upwardsAxis);
            transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, step * 2);
        }
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);
    }
}