敌人的运动旋转应攻击比赛,但不要攻击比赛



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()
    {
    }
}

Enementerritory

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;
        }
    }
}

欢迎任何反馈,我试图让我添加到游戏中的敌人,以朝着比赛朝上,仿佛要依恋并跟随我可以完成这项运动,我将让他们在玩耍时拍摄。目前,我添加的所有新敌人都在圆圈中非常快地旋转。我没有语法错误。

更新功能中肯定有一些可疑的东西,因为您要分配(=),而不是在条件下检查平等(==)。

您不是说playerInTerritory == true

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

如果这无济于事,请在触发/退出函数中添加一些Debug.Log语句,以查看它们何时被调用。


编辑

好吧,我看着旋转。如果您希望敌人跟随玩家直到攻击范围内,则既有错误的旋转又错误的翻译。

旋转

// 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()(它会使运动更流利),并且不要保持'awake','start','start','如果它们是空白的"更新"方法,因为它会影响性能(稍微)。

最新更新