我的敌人史莱姆物体总是追着我,即使声明另有说明

问题描述 投票:0回答:1

我希望我的敌人只在其玩家和敌人在同一个静态(不可移动)房间中时才追我,但无论哪种方式,它总是追赶玩家。下面是代码、检查器和场景附件。

enter image description here

在史莱姆室后面,但我的敌人仍在追赶玩家。

enter image description here

这是敌人检查员,即使它显示敌人不在房间里。

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

public class EnemySlimeController : MonoBehaviour
{
    public SlimeScriptableObject Slime;
    public GameObject target;
    public GameObject chamber;
    public GameObject player;
    public float followDistance;
    [SerializeField]
    public bool _playerInSight;
    [SerializeField]
    private bool _targetInSight;
    [SerializeField]
    private bool _inChamber = true;
    private Rigidbody _rb;
    private Vector3 _difference;
    private Vector3 _direction;
    private Vector3 _velocity;
    void Start()
    {
        _rb = this.gameObject.GetComponent<Rigidbody>();
        InvokeRepeating("ControlMovement", 1, Slime.invokeTime);
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _playerInSight = true;
        }
        else if (other.CompareTag("Enemy"))
        {
            _targetInSight = true;
            target = other.gameObject;
        }
        else if ((other.CompareTag("EnemyChamber")))
        {
            _inChamber = true;
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _playerInSight = false;
        }
        else if (other.CompareTag("Enemy"))
        {
            _targetInSight = false;
        }
        else if ((other.CompareTag("EnemyChamber"))){
            _inChamber = false;
        }

    }

    private void OnCollisionEnter(Collision collision)
    {
        MoveBackward(_rb, chamber, Slime.speed);
    }

    public void ControlMovement()
    {
        if (_inChamber == true)
        {
            if (_playerInSight && _targetInSight) MoveTowardsEntity(_rb, target, Slime.speed);

            if (_playerInSight && !_targetInSight) MoveTowardsPlayer(_rb, player, Slime.speed);

            if (!_playerInSight && _targetInSight) MoveTowardsPlayer(_rb, player, Slime.speed);

            if (!_playerInSight && !_targetInSight) MoveTowardsPlayer(_rb, player, Slime.speed);
        }
        if (_inChamber == false)
        {
            MoveBackward(_rb,chamber, Slime.speed);
        }
    }

    protected void MoveTowardsEntity(Rigidbody entity, GameObject target, float speed)
    {
        Debug.Log("�nside Target mov");
        _difference = target.transform.position - entity.transform.position;
        if ((_difference.x <= followDistance && _difference.x >= -followDistance) && (_difference.z <= followDistance && _difference.z >= -followDistance)) return;
        _direction = _difference.normalized;
        _velocity = _direction * speed;
        entity.velocity = _velocity;
    }
    protected void MoveBackward(Rigidbody entity, GameObject target, float speed)
    {
        Debug.Log("�nside Backward mov");
        _difference = target.transform.position - entity.transform.position;
        if ((_difference.x <= followDistance && _difference.x >= -followDistance) && (_difference.z <= followDistance && _difference.z >= -followDistance)) return;
        _direction = _difference.normalized;
        _velocity = _direction * speed;
        entity.velocity = _velocity;
    }
    protected void MoveTowardsPlayer(Rigidbody entity, GameObject target, float speed)
    {
        Debug.Log("�nside Player mov");
        _difference = target.transform.position - entity.transform.position;
        if ((_difference.x <= followDistance && _difference.x >= -followDistance) && (_difference.z <= followDistance && _difference.z >= -followDistance)) return;
        _direction = _difference.normalized;
        _velocity = _direction * speed;
        entity.velocity = _velocity;
    }
}

我尝试检查 if 语句,但在我看来一切正常。但我不明白敌人的追击。我复制粘贴了粘液控制器脚本并进行了编辑。这是我的史莱姆控制器脚本:

 public SlimeScriptableObject Slime;
    public GameObject target;
    public GameObject player;
    public float followDistance;
    [SerializeField]
    public bool _playerInSight;
    [SerializeField]
    private bool _targetInSight;
    private bool _isTouched = false;
    private Rigidbody _rb;
    private Vector3 _difference;
    private Vector3 _direction;
    private Vector3 _velocity;
    void Start()
    {
        _rb = this.gameObject.GetComponent<Rigidbody>();
        target = player;
        InvokeRepeating("ControlMovement", 1, Slime.invokeTime);
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _playerInSight = true;
        }
        else if(other.CompareTag("Enemy"))
        {
            _targetInSight = true;
            target = other.gameObject;
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _playerInSight = false;
        }
        else if(other.CompareTag("Enemy"))
        {
            _targetInSight = false;
        }

    }

    private void OnCollisionEnter(Collision collision)
    {
        _isTouched = true;
        MoveBackward(_rb, player , Slime.speed);
    }

    private void OnCollisionExit(Collision collision)
    {
        _isTouched = false;
    }

    public void ControlMovement()
    {
        if (_isTouched == false)
        {
            if (_playerInSight && _targetInSight) MoveTowardsEntity(_rb, target, Slime.speed);

            if (_playerInSight && !_targetInSight) MoveTowardsPlayer(_rb, player, Slime.speed);

            if (!_playerInSight && _targetInSight) MoveTowardsPlayer(_rb, player, Slime.speed);

            if (!_playerInSight && !_targetInSight) MoveTowardsPlayer(_rb, player, Slime.speed);
        }
        else
        {
            MoveBackward(_rb, player, Slime.speed);
        }
    }

    protected void MoveTowardsEntity(Rigidbody entity, GameObject target, float speed)
    {
        Debug.Log("Green İnside Target mov");
        _difference = target.transform.position - entity.transform.position;
        if ((_difference.x <= followDistance && _difference.x >= -followDistance) && (_difference.z <= followDistance && _difference.z >= -followDistance)) return;
        _direction = _difference.normalized;
        _velocity = _direction * speed;
        entity.velocity = _velocity;
    }
    protected void MoveBackward(Rigidbody entity, GameObject target, float speed)
    {
        Debug.Log("Green İnside Backward mov");
        _difference = target.transform.position - entity.transform.position;
        if ((_difference.x <= followDistance && _difference.x >= -followDistance) && (_difference.z <= followDistance && _difference.z >= -followDistance)) return;
        _direction = _difference.normalized;
        _velocity = _direction * speed;
        entity.velocity = _velocity;
    }
    protected void MoveTowardsPlayer(Rigidbody entity, GameObject target, float speed)
    {
        Debug.Log("Green İnside Player mov");
        _difference = target.transform.position - entity.transform.position;
        if ((_difference.x <= followDistance && _difference.x >= -followDistance) && (_difference.z <= followDistance && _difference.z >= -followDistance)) return;
        _direction = _difference.normalized;
        _velocity = _direction * speed;
        entity.velocity= _velocity;
    }```
unity-game-engine game-development unityscript unity3d-editor
1个回答
0
投票

我没有很好地阅读你的问题,但是当用户不再看到粘液时,你是否将

playerInSight
设置为
false
?如果您这样做,请告诉我,以便我仔细重新阅读问题。

© www.soinside.com 2019 - 2024. All rights reserved.