我希望我的敌人只在其玩家和敌人在同一个静态(不可移动)房间中时才追我,但无论哪种方式,它总是追赶玩家。下面是代码、检查器和场景附件。
在史莱姆室后面,但我的敌人仍在追赶玩家。
这是敌人检查员,即使它显示敌人不在房间里。
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;
}```
我没有很好地阅读你的问题,但是当用户不再看到粘液时,你是否将
playerInSight
设置为false
?如果您这样做,请告诉我,以便我仔细重新阅读问题。