private void ProcessInput() { // 如果有选择事件被触发 if (vrcon.selectVoxelInput.state) { // 选中位置的信息存入一个Voxel对象 Vector3Int pos = vrcon.GetScaledHandLocation(vrcon.rightHand); Voxel v = vp.targetObj.voxelObjectData.GetVoxelAt(pos); // 如果此处没有voxel if (v.voxel == null) { // 该位置不靠近已有的体素,取消所有选中的voxel if (!vp.targetObj.IsNearVoxel(pos)) { this.selectedVoxels.Clear(); } } // 如果有voxel,则选中该voxel并高亮显示 else if (!this.selectedVoxels.Contains(v)) { this.selectedVoxels.Add(v); v.color = Color.yellow; } } }
private void ProcessInput(ToolManager.InteractionMode mode) { if (mode == ToolManager.InteractionMode.Desktop) { if (hitPointReader.hitting) { // 按下鼠标左键 if (Input.GetKeyDown(KeyCode.Mouse0)) { // 保存当前世界中与选中Voxel位置相邻的Object List <ObjectComponent> Objects = new List <ObjectComponent>(); foreach (var o in WorldDataManager.Instance.ActiveWorld.ObjectList) { if (o.IsNearVoxel(hitPointReader.hitPoint.position + hitPointReader.hitPoint.normal / 2) && !o.voxelObjectData.isStatic) { WorldDataManager.Instance.ActiveWorld.SetVoxelAt( o, hitPointReader.hitPoint.position + hitPointReader.hitPoint.normal / 2, voxelArg); o.UpdateObjectMesh(); Objects.Add(o); } } // 如果没有Object与该Voxel相邻,则认为创建了一个新的Object if (Objects.Count == 0) { var o = WorldDataManager.Instance.ActiveWorld. CreateNewObject(MathHelper.WorldPosToWorldIntPos(hitPointReader.hitPoint.position + hitPointReader.hitPoint.normal / 2)); WorldDataManager.Instance.ActiveWorld.SetVoxelAt( o, hitPointReader.hitPoint.position + hitPointReader.hitPoint.normal / 2, voxelArg); o.UpdateObjectMesh(); } else // 将所有相邻的Object融合成一个新的Object { var firstObj = Objects[0]; for (int i = 1; i < Objects.Count; i++) { WorldDataManager.Instance.ActiveWorld.MergeTwoObjects(firstObj, Objects[i], WorldData.MergeType.Or); } } } // 点击鼠标右键 else if (Input.GetKeyDown(KeyCode.Mouse1)) { // 遍历被选中的Object,删除选中位置的Voxel List <ObjectComponent> deleteObjects = new List <ObjectComponent>(); foreach (var o in objectSelector.selectedObjects) { WorldDataManager.Instance.ActiveWorld.DeleteVoxelAt(o, hitPointReader.hitPoint.position - hitPointReader.hitPoint.normal / 2); if (o.voxelObjectData.VoxelDataDict.Count == 0) { deleteObjects.Add(o); } o.UpdateObjectMesh(); } for (int i = 0; i < deleteObjects.Count; i++) { WorldDataManager.Instance.ActiveWorld.DeleteObject(deleteObjects[i]); } } } } else // VR mode { // 创建新的voxel if (vrcon.createVoxelInput.state) { // 选中位置的信息存入一个Voxel对象 Vector3Int pos = vrcon.GetScaledHandLocation(vrcon.rightHand); Debug.Log(pos); Voxel v = this.targetObj.voxelObjectData.GetVoxelAt(pos - this.targetObj.gridBasePoint); // 如果此处没有voxel,进一步判断是否与已有voxel相连,如果相连,则处理按键的事件 if (v.voxel == null && this.targetObj.IsNearVoxel(pos)) { WorldDataManager.Instance.ActiveWorld.SetVoxelAt(this.targetObj, pos, voxelArg); this.targetObj.UpdateObjectMesh(); } } // 如果有voxel,则根据按键删除voxel if (vrcon.deleteVoxelInput.state) { Debug.Log("Delete"); // 选中位置的信息存入一个Voxel对象 Vector3Int pos = vrcon.GetScaledHandLocation(vrcon.rightHand); Voxel v = this.targetObj.voxelObjectData.GetVoxelAt(pos - this.targetObj.gridBasePoint); if (v.voxel != null) { Debug.Log("Delete" + v.voxel.name); WorldDataManager.Instance.ActiveWorld.DeleteVoxelAt(this.targetObj, pos); if (this.targetObj.voxelObjectData.VoxelDataDict.Count == 0) { WorldDataManager.Instance.ActiveWorld.DeleteObject(this.targetObj); } this.targetObj.UpdateObjectMesh(); } } } }