繁体   English   中英

如何在Unity中使用OnTriggerEnter2D停止AI运动?

[英]How do I stop AI movement with OnTriggerEnter2D in Unity?

我正在为Unity中的敌人创建一个基本的AI脚本,并且大部分脚本都按照我想要的方式工作。 我设置敌人的方式包含2个对撞机,一个多边形对撞机,在碰触时会摧毁玩家,以及一个空的游戏对象,它是敌人的孩子,而圆形对撞机则作为触发对象。 有一个标记为“ Straight Road的游戏对象,当圆碰撞器与之接触时,它应该运行一个名为StopMovement();的函数StopMovement(); 将敌人的运动设置为0。我以前使用Debug.Log(); 检查对撞机是否识别出它在碰Straight Road ,而没有。 这是我的下面的代码。 我希望有人提出建议。

public class DogAI : GenericController {

    public Transform target;
    public float chaseRange;
    public float maxDistance;

    private Vector3 targetDirection;
    private float targetDistance;

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

    // Update is called once per frame
    void Update()
    {
        base.Update();
        if (target.transform != null)
        {
            targetDirection = target.transform.position - transform.position;
            targetDirection = targetDirection.normalized;
            targetDistance = Vector3.Distance(target.position, transform.position);

            if (targetDistance <= chaseRange)
            {
               SetMovement(targetDirection);
            }

            Vector3 enemyScreenPosition = Camera.main.WorldToScreenPoint(transform.position);

            if (targetDistance > maxDistance)
            {
                Destroy(gameObject);
            }
        }
    }

    void StopMovement()
    {
        SetMovement(new Vector2(0,0));
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Straight Road"))
        {
            Debug.Log("Stop! There's a road!");//This never shows up in the log?
            StopMovement();
        }
    }

    void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            DestroyObject(other.gameObject);
        }
    } 

下面的通用控制器脚本包含SetMovement()函数。

public abstract class GenericController : MonoBehaviour
{
    public float movementSpeed = 20;
    float animationSpeed = 1;

    protected Rigidbody2D rigidbody;
    protected Animator animator;

    Vector2 movementVector;
    float currentSpeed;

    protected bool needAnimator = true;

    // Use this for initialization
    protected void Start()
    {
        rigidbody = GetComponent<Rigidbody2D>();

        if (needAnimator)
        {
            animator = GetComponent<Animator>();
            animator.speed = animationSpeed;
        }
    }


    protected void FixedUpdate()
    {
        rigidbody.velocity = movementVector;
        currentSpeed = rigidbody.velocity.magnitude;

        if (needAnimator)
            animator.SetFloat("Speed", currentSpeed);
    }

    public void SetMovement(Vector2 input)
    {
        movementVector = input * movementSpeed;
    }

    public void SetMovement(int x, int y)
    {
        SetMovement(new Vector2(x, y));
    }

文档中

MonoBehaviour.OnTriggerEnter2D(Collider2D)

当另一个对象进入连接到该对象的触发对撞机时发送(仅限2D物理)。

此处的关键字是enter 换句话说,触发是当出现对撞机的区域 ,就像进入地图,这里的区域是一个触发对撞机的一个区域的球员。 如果您希望在碰撞器与道路碰撞时发生某些事情,即当CircleCollider与道路接触时,那么您希望碰撞器不是触发器,并且希望功能位于OnCollisionEnter2D内部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM