简体   繁体   中英

How do I stop AI movement with OnTriggerEnter2D in Unity?

I'm creating a basic AI script for my enemies in Unity and I have most of it working the way I want it to. The way I have my enemies set up they contain 2 colliders, a polygon collider that destroys the player when touched, and an empty game object that's a child of the enemy that is a circle collider that acts as a trigger. There's a game object that's tagged Straight Road and when the circle collider comes in contact with it, it should run a function called StopMovement(); that sets the enemies movement to 0. I used to Debug.Log(); to check to see if the collider recognizes that it's touching Straight Road and it doesn't. This is my code below. I'm hoping someone has a suggestion.

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

Generic Controller script below containing the SetMovement() function.

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

From the documentation :

MonoBehaviour.OnTriggerEnter2D(Collider2D)

Sent when another object enters a trigger collider attached to this object (2D physics only).

The keyword here is enters . In other words, a trigger is for when something goes inside the area of the collider, like a player entering a region of the map, where the region is a trigger collider. If you want something to happen when a collider collides with the road, ie when your CircleCollider comes in contact with the road, then you want the collider to not be a trigger, and you want the functionality to be inside OnCollisionEnter2D .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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