写代码的时候在unity的OnTriggerEnter、OnTriggerStay、OnTriggerExit绕了好久,不太能理解它是在什么时候运行的,开了一个空工程文件来做实验,正方体作为触发器,球(必须要有刚体和碰撞体)负责进入,代码输出运行状态。
测试代码(挂正方体上)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnTriggerEnter(Collider other)
{
Debug.Log("Enter");
}
private void OnTriggerStay(Collider other)
{
Debug.Log("Stay");
}
private void OnTriggerExit(Collider other)
{
Debug.Log("Exit");
}
}
实验一:
运行前:球和触发器正方体在运行前重叠
enter后逐帧stay
重叠过程中禁用collider
结果:不执行exit
重叠过程中更换球所在层级
结果:无变化,持续stay
将球通过transform缩小至不接触触发器
结果:在物体最后一个顶点离开触发器时执行exit
将球通过transform移动至不接触触发器
结果:在物体最后一个顶点离开触发器时执行exit
ps.瞬移至不接触触发器也会执行exit
实验二:
运行前:球和触发器无接触
将球通过transform放大至接触触发器
结果:在物体第一个顶点接触触发器时执行enter
将球通过transform移动至接触触发器
结果:在物体第一个顶点接触触发器时执行enter
ps.瞬移至接触触发器,会执行enter、stay
总结:这三个函数是周期性执行的,在不禁用其必须组件的情况下,一定会将三个函数都按序执行一遍,Enter和Exit的判定都是最近顶点,只执行一次
2024.1.17
之前一直认为有OnTriggerEnter、stay、exit的方法代码必须挂在作为触发器的一方,也就是前面的正方体上的collider要勾选Is Trigger,后面做项目发现不是这样,又做了实验摸出来的规律是:
1)一方有rigidbody且双方都有collider
2)Is Trigger在任意一方的collider勾选上或两个collider都勾上
都会执行带OnTrigger的代码,无论它挂在正方体还是球上,若挂在正方体上检测到的collider就是球的collider,挂球上检测到的collider就是正方体的collider