Unity 家园系统(1) 家具摆放冲突检测

目录:

  1. 家具与家具碰撞检测
  2. 家具是否全部在可放置区域内
    2.1 标记可放置区域
    2.2 家具部分出界检测
    2.3 为什么要选择这种射线检测方案?不采用触发器
  3. 家具的拾取拖动

1. 家具与家具碰撞检测

检测方案:Rigidbody + BoxCollider, 刚体设置不受物理学影响,仅用于碰撞/触发功能;


Unity 家园系统(1) 家具摆放冲突检测_第1张图片
家具间碰撞检测-未碰撞.png
Unity 家园系统(1) 家具摆放冲突检测_第2张图片
家具间碰撞检测-已碰撞.png

选中的家具 与 放下作为障碍的家具 区分处理;

  1. 选中的家具
    包含组件:Rigidbody+BoxCollider(isTrigger = false)
  2. 放下作为障碍的家具
    包含组件:BoxCollider(isTrigger = true)
注意事项
  1. Rigidbody-isKinematic
    仅用于碰撞/触发功能.

self.rigidbody.isKinematic = true

isKinematic: Controls whether physics affects the rigidbody.
控制物理学是否够影响这个刚体。如果isKinematic启用,力、碰撞或关节将不会影响这个刚体。刚体将通过改变transform.postion根据动画或脚本完全控制。

  1. 选中的家具BoxCollider(isTrigger = false),这样只有与(isTrigger = true)的 BoxCollider才会触发OnTriggerStay事件。
    void OnTriggerStay (Collider collider)
    {
    // 检测collider.gameObject的layer和tag等标记
    ...
    }

2. 家具是否全部在可放置区域内

2.1 标记可放置区域, Mesh Collider

Unity 家园系统(1) 家具摆放冲突检测_第3张图片
标记可放置区域.png

2.2 家具部分出界检测

Unity 家园系统(1) 家具摆放冲突检测_第4张图片
家具在房间边界.png
Unity 家园系统(1) 家具摆放冲突检测_第5张图片
家具部分出界.png

家具部分出界检测方案:

  1. 获取家具下的Collider list: transform.GetComponentsInChildren ();
  2. 获取Collider下的bounds.max,bounds.min坐标点作为检测点
  3. Ray射线检测, Physics.RaycastAll (shootRay, range),在检测点上方一定高度发射一条射线,与放置区域的Mesh Collider检测,判断是否在可放置区域内。

2.3 为什么要选择这种射线检测方案?不采用触发器

  1. 检测的精度较高(取决于碰撞盒数量)。可降低检测频率 控制性能消耗。
  2. 一个家具的碰撞盒数量1-6个,数量可控,若要优化可减少家具碰撞盒数量,制定家具制作规范
  3. 只需对地图标记可放置区域,容易扩展,且复杂度不高;对配置者来说,工作量可接受。
    若采用触发器检测,则需要在不可放置区域全部都加上BoxCollider(isTrigger = true),增加很多额外配置工作,一旦地图布局修改,改动太大,不利于扩展。
  4. 不需要再额外配置家具。

3. 家具的拾取拖动

使用EasyTouch 的On_Drag事件来监听家具的拾取,获取到家具的屏幕坐标,再通过射线检测获取对应地图坐标。 如何设置?

相关文章

  1. EasyTouch On_Drag监听设置

你可能感兴趣的:(Unity 家园系统(1) 家具摆放冲突检测)