目录:
- 家具与家具碰撞检测
- 家具是否全部在可放置区域内
2.1 标记可放置区域
2.2 家具部分出界检测
2.3 为什么要选择这种射线检测方案?不采用触发器 - 家具的拾取拖动
1. 家具与家具碰撞检测
检测方案:Rigidbody + BoxCollider, 刚体设置不受物理学影响,仅用于碰撞/触发功能;
选中的家具 与 放下作为障碍的家具 区分处理;
- 选中的家具
包含组件:Rigidbody+BoxCollider(isTrigger = false) - 放下作为障碍的家具
包含组件:BoxCollider(isTrigger = true)
注意事项
- Rigidbody-isKinematic
仅用于碰撞/触发功能.
self.rigidbody.isKinematic = true
isKinematic: Controls whether physics affects the rigidbody.
控制物理学是否够影响这个刚体。如果isKinematic启用,力、碰撞或关节将不会影响这个刚体。刚体将通过改变transform.postion根据动画或脚本完全控制。
- 选中的家具BoxCollider(isTrigger = false),这样只有与(isTrigger = true)的 BoxCollider才会触发OnTriggerStay事件。
void OnTriggerStay (Collider collider)
{
// 检测collider.gameObject的layer和tag等标记
...
}
2. 家具是否全部在可放置区域内
2.1 标记可放置区域, Mesh Collider
2.2 家具部分出界检测
家具部分出界检测方案:
- 获取家具下的Collider list: transform.GetComponentsInChildren<Collider> ();
- 获取Collider下的bounds.max,bounds.min坐标点作为检测点
- Ray射线检测, Physics.RaycastAll (shootRay, range),在检测点上方一定高度发射一条射线,与放置区域的Mesh Collider检测,判断是否在可放置区域内。
2.3 为什么要选择这种射线检测方案?不采用触发器
- 检测的精度较高(取决于碰撞盒数量)。可降低检测频率 控制性能消耗。
- 一个家具的碰撞盒数量1-6个,数量可控,若要优化可减少家具碰撞盒数量,制定
家具制作规范
。 - 只需对地图标记可放置区域,容易扩展,且复杂度不高;对配置者来说,工作量可接受。
若采用触发器检测,则需要在不可放置区域全部都加上BoxCollider(isTrigger = true),增加很多额外配置工作,一旦地图布局修改,改动太大,不利于扩展。 - 不需要再额外配置家具。
3. 家具的拾取拖动
使用EasyTouch 的On_Drag事件来监听家具的拾取,获取到家具的屏幕坐标,再通过射线检测获取对应地图坐标。 如何设置?