23.核心系统-物理系统-范围检测
23.1 知识点
知识回顾 物理系统之碰撞检测
碰撞产生的必要条件
- 至少一个物体有刚体
- 两个物体都必须有碰撞器
碰撞和触发
- 碰撞会产生实际的物理效果
- 触发看起来不会产生碰撞,但是可以通过函数监听触发
- 碰撞检测主要用于实体物体之间产生物理效果时使用
什么是范围检测
- 游戏中瞬时的攻击范围判断一般会使用范围检测
- 举例:
- 玩家在前方5m处释放一个地刺魔法,在此处范围内的对象将受到地刺伤害
- 玩家攻击,在前方1米圆形范围内对象都受到伤害
- 类似这种并没有实体物体,只想要检测在指定某一范围是否让敌方受到伤害时,便可以使用范围判断
- 在指定位置进行范围判断,我们可以得到处于指定范围内的对象
- 目的是对对象进行处理,比如受伤、减血等等
层级
LayerMask中的NameToLayer方法 传入层级名字返回层级索引
- 给定层名称,返回在 Tags and Layers manager 中由 Builtin 或 User Layer 定义的层索引。
print(LayerMask.NameToLayer("UI")); // 5
层级重要知识点补充 通过编号左移构建二进制数
- 通过名字得到层级编号
LayerMask.NameToLayer - 我们需要通过编号左移构建二进制数
- 这样每一个编号的层级都是对应位为1的2进制数
- 我们通过位运算可以选择想要检测的层级
- 好处是一个int就可以表示所有想要检测的层级信息
- 层级编号是 0~31,刚好32位,是一个int数的比特位数
- 每一个编号代表的都是二进制的一位
- 第0层—— 1 << 0——0000 0000 0000 0000 0000 0000 0000 0001 = 1
- 第1层—— 1 << 1——0000 0000 0000 0000 0000 0000 0000 0010 = 2
- 第2层—— 1 << 2——0000 0000 0000 0000 0000 0000 0000 0100 = 4
- 第3层—— 1 << 3——0000 0000 0000 0000 0000 0000 0000 1000 = 8
- 第4层—— 1 << 4——0000 0000 0000 0000 0000 0000 0001 0000 = 16
- 第5层—— 1 << 5——0000 0000 0000 0000 0000 0000 0010 0000 = 32
层级重要知识点通俗理解
- Unity是用二进制来判断层级的
- 比如:
LayerMask.NameToLayer("Default")是第0层,就用二进制0000 0001来代表这一层,1左移了0位LayerMask.NameToLayer("UI")是第5层,就用二进制0010 0000来代表这一层,1左移了5位
- 假如既想检测Default层又想检测UI层,就把这两个层级的二进制进行或运算
1 << LayerMask.NameToLayer("UI") | 1 << LayerMask.NameToLayer("Default")
- 或运算后的二进制是 0010 0001
- 当触发层级检测时,就拿出这个算好的0010 0001和对应的层级的二进制进行与操作
- 比如和第1层进行与操作
- 0010 0001
- 0000 0010
- 0000 0000
- 得到的是0,就不进行这一层级的判断了
- 假如和第5层进行与操作
- 0010 0001
- 0010 0000
- 0010 0000
- 得到的数不为0,就进行这一层级判断
- 比如和第1层进行与操作
- 比如:
范围检测必备条件
- 想要被范围检测到的对象必须具备碰撞器
范围检测注意点
- 范围检测相关API只有当执行该句代码时进行一次范围检测,它是瞬时的
- 范围检测相关API并不会真正产生一个碰撞器,只是碰撞判断计算而已
范围检测API
Physics.OverlapBox方法 盒状范围检测
- 查找与给定盒体接触或位于盒体内部的所有碰撞体。
- 参数:
- 立方体中心点
- 立方体三边大小,构成立方体的长宽高的一半
- 立方体角度,传入四元数
- 检测指定层级(不填检测所有层)
- 是否忽略触发器,UseGlobal-使用全局设置,不填默认使用UseGlobal
//Physics.OverlapBox静态方法 盒状范围检测
//查找与给定盒体接触或位于盒体内部的所有碰撞体。
//他不是一直都会检测的 可以通俗的理解为在执行代码的瞬间在场景创建一个盒型碰撞器检测碰撞的对象 但只是用于计算碰撞情况 不是真的创建出来
//参数一:立方体中心点
//参数二:立方体三边大小 构成立方体的长宽高的一半
//参数三:立方体角度 传入四元数
//参数四:检测指定层级(不填检测所有层) 用NameToLayer传入对应层级名字 并且要用1 <<左移 可以或运算
//参数五:
//是否忽略触发器 UseGlobal-使用全局设置 不填默认使用UseGlobal 全局设置在ProjectSettings中的Physics里的 Queries Hit Triggers 可以查看并设置
//Collide-检测触发器 Ignore-忽略触发器 手动选择单独设置
//返回值:在该范围内的碰撞器数组(得到了对象触发器就可以得到对象的所有信息)
Collider[] colliders = Physics.OverlapBox(Vector3.zero, Vector3.one, Quaternion.AngleAxis(45, Vector3.up),
1 << LayerMask.NameToLayer("UI") |
1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal);
//打印在该范围内的碰撞器的所有信息
for (int i = 0; i < colliders.Length; i++)
{
print(colliders[i].gameObject.name);
}
Physics.OverlapBoxNonAlloc方法 盒状范围检测
- 查找与给定盒体接触或位于盒体内部的所有碰撞体,并将它们存储到缓冲区中。
- 返回值:碰撞到的碰撞器数量
//Physics.OverlapBoxNonAlloc静态方法 盒状范围检测 并且要传入一个数组 数组会装载碰撞到的碰撞器 返回碰撞器个数
//查找与给定盒体接触或位于盒体内部的所有碰撞体,并将它们存储到缓冲区中。
//参数:和OverlapBox相比,要多传入一个数组,会存储碰撞到的碰撞器,其他参数都差不多
//返回值:碰撞到的碰撞器数量
//Physics.OverlapBoxNonAlloc()
if (Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders) != 0)
{
// 处理碰撞器
}
Physics.OverlapSphere方法 球形范围检测
- 计算并存储接触球体或位于球体内部的碰撞体。
- 返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
//Physics.OverlapSphere静态方法 球形范围检测
//计算并存储接触球体或位于球体内部的碰撞体。
//参数一:中心点
//参数二:球半径
//参数三:检测指定层级(不填检测所有层)
//参数四:是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal
//返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
colliders = Physics.OverlapSphere(Vector3.zero, 5, 1 << LayerMask.NameToLayer("Default"));
Physics.OverlapSphereNonAlloc方法 球形范围检测
- 计算与球体接触或位于球体内部的碰撞体,并将它们存储到提供的缓冲区中。
- 返回值:碰撞到的碰撞器数量
//Physics.OverlapSphereNonAlloc静态方法 球形范围检测 并且要传入一个数组 数组会装载碰撞到的碰撞器 返回碰撞器个数
//计算与球体接触或位于球体内部的碰撞体,并将它们存储到提供的缓冲区中。
//参数:和OverlapSphere相比,要多传入一个数组,会存储碰撞到的碰撞器,其他参数都差不多
//返回值:碰撞到的碰撞器数量
if (Physics.OverlapSphereNonAlloc(Vector3.zero, 5, colliders) != 0)
{
}
Physics.OverlapCapsule方法 胶囊范围检测
- 在物理世界中检查给定胶囊体,并返回所有重叠的碰撞体。
- 返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
//Physics.OverlapCapsule静态方法 胶囊范围检测
//在物理世界中检查给定胶囊体,并返回所有重叠的碰撞体。
//参数一:半圆一中心点
//参数二:半圆二中心点
//前两个参数决定胶囊中间的圆柱体情况
//参数三:上下两个半球体半径
//参数四:检测指定层级(不填检测所有层)
//参数五:是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal
//返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
colliders = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal);
Physics.OverlapCapsuleNonAlloc方法 胶囊范围检测
- 在物理世界中检查给定胶囊体,并在用户提供的缓冲区中返回所有重叠的碰撞体。
- 返回值:碰撞到的碰撞器数量
//Physics.OverlapCapsuleNonAlloc静态方法 胶囊范围检测 并且要传入一个数组 数组会装载碰撞到的碰撞器 返回碰撞器个数
//在物理世界中检查给定胶囊体,并在用户提供的缓冲区中返回所有重叠的碰撞体。
//参数:和OverlapCapsule相比,要多传入一个数组,会存储碰撞到的碰撞器,其他参数都差不多
//返回值:碰撞到的碰撞器数量
if (Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders) != 0)
{
}
总结
- 范围检测主要用于瞬时的碰撞范围检测
- 主要掌握Physics类中的静态方法,球形、盒状、胶囊三种API的使用即可
23.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson23_核心系统_物理系统之范围检测 : MonoBehaviour
{
void Start()
{
#region 知识回顾 物理系统之碰撞检测
//碰撞产生的必要条件
//1.至少一个物体有刚体
//2.两个物体都必须有碰撞器
//碰撞和触发
//碰撞会产生实际的物理效果
//触发看起来不会产生碰撞但是可以通过函数监听触发
//碰撞检测主要用于实体物体之间产生物理效果时使用
#endregion
#region 知识点一 什么是范围检测
//游戏中瞬时的攻击范围判断一般会使用范围检测
//举例:
//1.玩家在前方5m处释放一个地刺魔法,在此处范围内的对象将受到地刺伤害
//2.玩家攻击,在前方1米圆形范围内对象都受到伤害
//等等
//类似这种并没有实体物体 只想要检测在指定某一范围是否让敌方受到伤害时 便可以使用范围判断
//简而言之
//在指定位置 进行 范围判断 我们可以得到处于指定范围内的 对象
//目的是对 对象进行处理
//比如 受伤 减血等等
#endregion
#region 知识点二 如何进行范围检测
//LayerMask中的NameToLayer静态方法 传入层级名字返回层级索引
//给定层名称,返回在 Tags and Layers manager 中由 Builtin 或 User Layer 定义的层索引。
print(LayerMask.NameToLayer("UI"));//5
//层级重要知识点补充:
//通过名字得到层级编号 LayerMask.NameToLayer
//我们需要通过编号左移构建二进制数
//这样每一个编号的层级 都是 对应位为1的2进制数
//我们通过 位运算 可以选择想要检测层级
//好处 一个int 就可以表示所有想要检测的层级信息
//层级编号是 0~31 刚好32位
//是一个int数的比特位数
//每一个编号 代表的 都是二进制的一位
//第0层—— 1 << 0——0000 0000 0000 0000 0000 0000 0000 0001 = 1
//第1层—— 1 << 1——0000 0000 0000 0000 0000 0000 0000 0010 = 2
//第2层—— 1 << 2——0000 0000 0000 0000 0000 0000 0000 0100 = 4
//第3层—— 1 << 3——0000 0000 0000 0000 0000 0000 0000 1000 = 8
//第4层—— 1 << 4——0000 0000 0000 0000 0000 0000 0001 0000 = 16
//第5层—— 1 << 5——0000 0000 0000 0000 0000 0000 0010 0000 = 32
//层级重要知识点通俗理解
//Unity是用二进制来判断层级的
//比如:
//LayerMask.NameToLayer("Default") 是第0层 就用二进制0000 0001来代表这一层 1左移了0位
//LayerMask.NameToLayer("UI") 是第5层 就用二进制0010 0000来代表这一层 1左移了5位
//假如既想检测Default层 又想检测UI层 就把这两个层级的二进制或起来
//1 << LayerMask.NameToLayer("UI") | 1 << LayerMask.NameToLayer("Default")
//或过之后的二进制是 0010 0001
//当触发层级检测时 就拿出这个算好的0010 0001 和对应的层级的二进制 进行与操作
//比如和第1层进行与操作
// 0010 0001
// 0000 0010
// 0000 0000
//得到的是0 就不进行这一层级的判断了
//假如和第5层进行与操作
// 0010 0001
// 0010 0000
// 0010 0000
//得到的数不为0 就进行这一层级判断
//范围检测必备条件:想要被范围检测到的对象 必须具备碰撞器
//注意点:
//1.范围检测相关API 只有当执行该句代码时 进行一次范围检测 它是瞬时的
//2.范围检测相关API 并不会真正产生一个碰撞器 只是碰撞判断计算而已
//范围检测API
//Physics类中的OverlapBox静态方法 盒状范围检测
//查找与给定盒体接触或位于盒体内部的所有碰撞体。
//他不是一直都会检测的 可以通俗的理解为在执行代码的瞬间在场景创建一个盒型碰撞器检测碰撞的对象 但只是用于计算碰撞情况 不是真的创建出来
//参数一:立方体中心点
//参数二:立方体三边大小 构成立方体的长宽高的一半
//参数三:立方体角度 传入四元数
//参数四:检测指定层级(不填检测所有层) 用NameToLayer传入对应层级名字 并且要用1 <<左移 可以或运算
//参数五:
//是否忽略触发器 UseGlobal-使用全局设置 不填默认使用UseGlobal 全局设置在ProjectSettings中的Physics里的 Queries Hit Triggers 可以查看并设置
//Collide-检测触发器 Ignore-忽略触发器 手动选择单独设置
//返回值:在该范围内的碰撞器数组(得到了对象触发器就可以得到对象的所有信息)
Collider[] colliders = Physics.OverlapBox(Vector3.zero, Vector3.one, Quaternion.AngleAxis(45, Vector3.up),
1 << LayerMask.NameToLayer("UI") |
1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal);
//打印在该范围内的碰撞器的所有信息
for (int i = 0; i < colliders.Length; i++)
{
print(colliders[i].gameObject.name);
}
//Physics类中的OverlapBoxNonAlloc静态方法 盒状范围检测 并且要传入一个数组 数组会装载碰撞到的碰撞器 返回碰撞器个数
//查找与给定盒体接触或位于盒体内部的所有碰撞体,并将它们存储到缓冲区中。
//参数:和OverlapBox相比,要多传入一个数组,会存储碰撞到的碰撞器,其他参数都差不多
//返回值:碰撞到的碰撞器数量
//Physics.OverlapBoxNonAlloc()
if (Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders) != 0)
{
}
//Physics类中的OverlapSphere静态方法 球形范围检测
//计算并存储接触球体或位于球体内部的碰撞体。
//参数一:中心点
//参数二:球半径
//参数三:检测指定层级(不填检测所有层)
//参数四:是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal
//返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
colliders = Physics.OverlapSphere(Vector3.zero, 5, 1 << LayerMask.NameToLayer("Default"));
//Physics类中的OverlapSphereNonAlloc静态方法 球形范围检测 并且要传入一个数组 数组会装载碰撞到的碰撞器 返回碰撞器个数
//计算与球体接触或位于球体内部的碰撞体,并将它们存储到提供的缓冲区中。
//参数:和OverlapSphere相比,要多传入一个数组,会存储碰撞到的碰撞器,其他参数都差不多
//返回值:碰撞到的碰撞器数量
if (Physics.OverlapSphereNonAlloc(Vector3.zero, 5, colliders) != 0)
{
}
//Physics类中的OverlapCapsule静态方法 胶囊范围检测
//在物理世界中检查给定胶囊体,并返回所有重叠的碰撞体。
//参数一:半圆一中心点
//参数二:半圆二中心点
//前两个参数决定胶囊中间的圆柱体情况
//参数三:上下两个半球体半径
//参数四:检测指定层级(不填检测所有层)
//参数五:是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal
//返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
colliders = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal);
//Physics类中的OverlapCapsuleNonAlloc静态方法 胶囊范围检测 并且要传入一个数组 数组会装载碰撞到的碰撞器 返回碰撞器个数
//在物理世界中检查给定胶囊体,并在用户提供的缓冲区中返回所有重叠的碰撞体。
//参数:和OverlapCapsule相比,要多传入一个数组,会存储碰撞到的碰撞器,其他参数都差不多
//返回值:碰撞到的碰撞器数量
if (Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders) != 0)
{
}
#endregion
#region 总结
//范围检测主要用于瞬时的碰撞范围检测
//主要掌握
//Physics类中的静态方法
//球形 盒状 胶囊三种API的使用即可
#endregion
}
}
23.3 练习题
世界坐标原点有一个立方体,键盘WASD键可以控制其前后移动和旋转,请结合所学知识实现,按J键在立方体面朝向前方1米处进行立方体范围检测,按K键在立方体前面5米范围内进行胶囊范围检测,按L键以立方体脚下为原点,半径10米内进行球形范围检测
定义了两个公开变量,分别表示移动速度和旋转速度。
// 定义了两个公开变量,分别表示移动速度和旋转速度。
public float moveSpeed;
public float roundSpeed;
在 Update 函数中检测角色的输入操作,并且通过 Unity3D 提供的 Physics 类进行场景物理模拟碰撞检测的应用和执行,根据按下 J, K 和 L 键不同会得到不同类型的碰撞检测结果。
// 在 Update 函数中检测角色的输入操作,并且通过 Unity3D 提供的 Physics 类进行场景物理模拟碰撞检测的应用和执行,根据按下 J, K 和 L 键不同会得到不同类型的碰撞检测结果。
void Update()
{
// 位移:使用 this.transform.Translate() 将角色对应的游戏对象在沿着 Z 轴正方向移动速度(moveSpeed)单位*(Input.GetAxis("Vertical"))
this.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed * Input.GetAxis("Vertical"));
// 旋转:使用 this.transform.Rotate() 将角色对应的游戏对象 沿着 Y 轴正方向 绕转速(roundSpeed)值*Time.deltaTime 角度*(Input.GetAxis("Horizontal"))
this.transform.Rotate(Vector3.up, Input.GetAxis("Horizontal") * roundSpeed * Time.deltaTime);
// 按下J键进行碰撞检测:在当前位置追加一个长宽高半径为0.5f的盒子,在指定图层标识(Monster)中查找已有物体
if (Input.GetKeyDown(KeyCode.J))
{
//因为是长宽高的一半 使用单位向量乘0.5 传入 Vector3.one * 0.5f 这样才算一个长宽高都是1的立方体
//创建出来的立方体要保持和当前立方体相同的旋转,否则不是刚好在前面
Collider[] colliders = Physics.OverlapBox(this.transform.position + this.transform.forward, Vector3.one * 0.5f, this.transform.rotation, 1 << LayerMask.NameToLayer("Monster"));
for (int i = 0; i < colliders.Length; i++)
{
print("盒子 物体受伤" + colliders[i].gameObject.name);
}
}
// 按下K键进行碰撞检测:在当前位置追加一个纵向长度为5,由一顶端圆柱和两个相互背离异形盘组成的胶囊体,并且在指定图层标识(Monster)中查找已有物体。
//可以理解为往前面吐火 或者刺出来长枪
if (Input.GetKeyDown(KeyCode.K))
{
Collider[] colliders = Physics.OverlapCapsule(this.transform.position, this.transform.position + this.transform.forward * 5, 0.5f, 1 << LayerMask.NameToLayer("Monster"));
for (int i = 0; i < colliders.Length; i++)
{
print("胶囊 物体受伤" + colliders[i].gameObject.name);
}
}
// 按下L键进行碰撞检测:以当前位置为球心,在半径为10米的范围内,检测并返回指定物理图层(Monster)下所有的碰撞体 collider
//比如有些时候范围内加buff或者震开敌人
if (Input.GetKeyDown(KeyCode.L))
{
Collider[] colliders = Physics.OverlapSphere(this.transform.position, 10, 1 << LayerMask.NameToLayer("Monster"));
for (int i = 0; i < colliders.Length; i++)
{
print("球 物体受伤" + colliders[i].gameObject.name);
}
}
}
23.4 练习题代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//这个脚本要挂载到立方体上
public class Lesson23_练习题 : MonoBehaviour
{
#region 练习题一
//世界坐标原点有一个立方体,键盘WASD键可以控制其前后移动和旋转
//请结合所学知识实现
//1.按J键在立方体面朝向前方1米处进行立方体范围检测
//2.按K键在立方体前面5米范围内进行胶囊范围检测
//3.按L键以立方体脚下为原点,半径10米内进行球形范围检测
// 定义了两个公开变量,分别表示移动速度和旋转速度。
public float moveSpeed;
public float roundSpeed;
// 在 Update 函数中检测角色的输入操作,并且通过 Unity3D 提供的 Physics 类进行场景物理模拟碰撞检测的应用和执行,根据按下 J, K 和 L 键不同会得到不同类型的碰撞检测结果。
void Update()
{
// 位移:使用 this.transform.Translate() 将角色对应的游戏对象在沿着 Z 轴正方向移动速度(moveSpeed)单位*(Input.GetAxis("Vertical"))
this.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed * Input.GetAxis("Vertical"));
// 旋转:使用 this.transform.Rotate() 将角色对应的游戏对象 沿着 Y 轴正方向 绕转速(roundSpeed)值*Time.deltaTime 角度*(Input.GetAxis("Horizontal"))
this.transform.Rotate(Vector3.up, Input.GetAxis("Horizontal") * roundSpeed * Time.deltaTime);
// 按下J键进行碰撞检测:在当前位置追加一个长宽高半径为0.5f的盒子,在指定图层标识(Monster)中查找已有物体
if (Input.GetKeyDown(KeyCode.J))
{
//因为是长宽高的一半 使用单位向量乘0.5 传入 Vector3.one * 0.5f 这样才算一个长宽高都是1的立方体
//创建出来的立方体要保持和当前立方体相同的旋转,否则不是刚好在前面
Collider[] colliders = Physics.OverlapBox(this.transform.position + this.transform.forward, Vector3.one * 0.5f, this.transform.rotation, 1 << LayerMask.NameToLayer("Monster"));
for (int i = 0; i < colliders.Length; i++)
{
print("盒子 物体受伤" + colliders[i].gameObject.name);
}
}
// 按下K键进行碰撞检测:在当前位置追加一个纵向长度为5,由一顶端圆柱和两个相互背离异形盘组成的胶囊体,并且在指定图层标识(Monster)中查找已有物体。
//可以理解为往前面吐火 或者刺出来长枪
if (Input.GetKeyDown(KeyCode.K))
{
Collider[] colliders = Physics.OverlapCapsule(this.transform.position, this.transform.position + this.transform.forward * 5, 0.5f, 1 << LayerMask.NameToLayer("Monster"));
for (int i = 0; i < colliders.Length; i++)
{
print("胶囊 物体受伤" + colliders[i].gameObject.name);
}
}
// 按下L键进行碰撞检测:以当前位置为球心,在半径为10米的范围内,检测并返回指定物理图层(Monster)下所有的碰撞体 collider
//比如有些时候范围内加buff或者震开敌人
if (Input.GetKeyDown(KeyCode.L))
{
Collider[] colliders = Physics.OverlapSphere(this.transform.position, 10, 1 << LayerMask.NameToLayer("Monster"));
for (int i = 0; i < colliders.Length; i++)
{
print("球 物体受伤" + colliders[i].gameObject.name);
}
}
}
#endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com