C# 如何在Unity中阻止OnTiggerInter2D的AI运动?

C# 如何在Unity中阻止OnTiggerInter2D的AI运动?,c#,unity3d,C#,Unity3d,我正在为我在Unity中的敌人创建一个基本的AI脚本,我已经按照我想要的方式完成了大部分工作。我设置敌人的方式包括两个碰撞器,一个多边形碰撞器,当被触摸时会摧毁玩家,还有一个空的游戏对象,它是敌人的孩子,是一个圆形碰撞器,充当触发器。有一个游戏对象被标记为直道,当圆圈碰撞器与之接触时,它应该运行一个名为stopmotation()的函数将敌人移动设置为0。我曾经Debug.Log()检查碰撞器是否识别出它正在接触的是直线道路,而不是直线道路。下面是我的代码。我希望有人能给我一个建议 public

我正在为我在Unity中的敌人创建一个基本的AI脚本,我已经按照我想要的方式完成了大部分工作。我设置敌人的方式包括两个碰撞器,一个多边形碰撞器,当被触摸时会摧毁玩家,还有一个空的游戏对象,它是敌人的孩子,是一个圆形碰撞器,充当触发器。有一个游戏对象被标记为
直道
,当圆圈碰撞器与之接触时,它应该运行一个名为
stopmotation()的函数将敌人移动设置为0。我曾经
Debug.Log()
检查碰撞器是否识别出它正在接触的是直线道路,而不是直线道路。下面是我的代码。我希望有人能给我一个建议

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

单行为。OnTriggerInter2D(碰撞R2D)

当另一个对象进入附加到此对象的触发器碰撞器时发送(仅限于2D物理)

这里的关键字是进入。换句话说,触发器用于当某个东西进入碰撞器的区域时,例如玩家进入地图的某个区域,该区域是触发器碰撞器。如果您希望在碰撞器与道路碰撞时发生某种情况,即当您的
环形碰撞器与道路接触时,那么您希望碰撞器不是触发器,您希望功能位于内部。

来自:

单行为。OnTriggerInter2D(碰撞R2D)

当另一个对象进入附加到此对象的触发器碰撞器时发送(仅限于2D物理)


这里的关键字是进入。换句话说,触发器用于当某个东西进入碰撞器的区域时,例如玩家进入地图的某个区域,该区域是触发器碰撞器。如果您希望在碰撞器与道路碰撞时发生某些事情,即当您的
环形碰撞器与道路接触时,那么您希望碰撞器不是触发器,您希望功能位于内部。

是否尝试打印other.gameObject.tag?如果它是一个预制件或其他东西,可能会有名称上的差异。像“直路(克隆)”之类的东西不是这样的。我在现场设置了一条路进行测试,这样就不会发生这种情况。我最近才弄明白为什么调试没有显示在控制台上。我最后把一个
2D盒子碰撞器
连接到了道路上。它显示了调试,但仍然没有运行
stopmotation()
您可以共享setmovement代码吗?不妨查看一下那里以及任何其他附加了移动代码的地方?在你说停止移动后,你是否检查了你的代码是否在更新中运行?我可以看到
如果(target.transform!=null)
仍然存在,如果您没有使target.transform=null,这也可能导致在更新中覆盖您的stopmotation。我可以添加
SetMovement
代码。这是我团队中另一个人创建的一个单独的类。我有
if(target.transform!=null)
在那里,只是为了确保我们没有错误地忘记将播放器添加到场景中。不确定这是否是问题的一部分。为什么
CompareTag
?不应该是
other.gameObject.tag
?是否尝试打印other.gameObject.tag?如果它是一个预制件或其他东西,可能会有名称上的差异。像“直路(克隆)”之类的东西不是这样的。我在现场设置了一条路进行测试,这样就不会发生这种情况。我最近才弄明白为什么调试没有显示在控制台上。我最后把一个
2D盒子碰撞器
连接到了道路上。它显示了调试,但仍然没有运行
stopmotation()
您可以共享setmovement代码吗?不妨查看一下那里以及任何其他附加了移动代码的地方?在你说停止移动后,你是否检查了你的代码是否在更新中运行?我可以看到
如果(target.transform!=null)
仍然存在,如果您没有使target.transform=null,这也可能导致在更新中覆盖您的stopmotation。我可以添加
SetMovement
代码。这是我团队中另一个人创建的一个单独的类。我有
if(target.transform!=null)
在那里,只是为了确保我们没有错误地忘记将播放器添加到场景中。不确定这是否是问题的一部分。为什么
CompareTag
?它不应该是
other.gameObject.tag
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));
    }