Вращение вражеского движения должно атаковать игроков, но не так ли? - PullRequest
0 голосов
/ 15 февраля 2019

BasicEnemy

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

public class BasicEnemy : MonoBehaviour
{
    public Transform target;
    public float speed = 3f;
    public float attack1Range = 1f;
    public int attack1Damage = 1;
    public float timeBetweenAttacks;


    // Use this for initialization
    void Start()
    {
        Rest();
    }

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

    }

    public void MoveToPlayer()
    {
        //rotate to look at player
        transform.LookAt(target.position);
        transform.Rotate(new Vector3(0, -90, 0), Space.Self);

        //move towards player
        if (Vector3.Distance(transform.position, target.position) > attack1Range)
        {
            transform.Translate(new Vector3(speed * Time.deltaTime, 0,     0));
        }
    }

    public void Rest()
    {

    }
}

EnemyTerritory

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


public class EnemyTerritory : MonoBehaviour
{
    public BoxCollider territory;
    GameObject player;
    bool playerInTerritory;

    public GameObject enemy;
    BasicEnemy basicenemy;

    // Use this for initialization
    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        basicenemy = enemy.GetComponent<BasicEnemy>();
        playerInTerritory = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (playerInTerritory)
        {
            basicenemy.MoveToPlayer();
        }

        if (playerInTerritory)
        {
            basicenemy.Rest();
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject == player)
        {
            playerInTerritory = true;
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.gameObject == player)
        {
            playerInTerritory = false;
        }
    }
}

Любые отзывы приветствуются Я пытаюсь получить врагов, которых я добавил в игру, чтобыдвигаться в сторону игрока, как будто присоединяясь и следуя, как только я смогу сделать это с движением, я заставлю их стрелять по игроку.сейчас все новые враги, которых я добавил, вращаются очень быстро по кругу.Я не получаю синтаксических ошибок.

1 Ответ

0 голосов
/ 15 февраля 2019

В функции Update определенно есть что-то подозрительное, потому что вы присваиваете (=) вместо проверки на равенство (==) в условии.

Разве вы не имели в виду playerInTerritory == true?

void Update()
{
    if (playerInTerritory)
    {
        basicenemy.MoveToPlayer();
    } 
    else 
    {        
        basicenemy.Rest();
    }
}

Если это не помогает, добавьте несколько операторов Debug.Log в функции входа / выхода триггера, чтобы увидеть, когда они выполняютсязвонил.


Edit

Хорошо, я посмотрел на спиннинг.Если вы хотите, чтобы противник следовал за игроком до тех пор, пока он не окажется в пределах диапазона атаки, у вас будет неправильное вращение и неправильный перевод.

Вращение

// Rotate to look at player
transform.LookAt(target.position);
transform.Rotate(new Vector3(0, -90, 0), Space.Self);  

Что это делает, он делаетВраг поворачивается к игроку (который вы хотите), и вторая линия делает вражеский поворот (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() вместо обычного Update() (это делает движение более плавным) и не держите методы «Пробуждение», «Пуск», «Обновление» рядом, если они пусты, поскольку это может повлиять на производительность (незначительно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...