///创建方块堆 private void CreateCubes() { if (m_info == null) { return; } ModelCube prefab = Resources.Load <ModelCube>("Prefabs/ModelCube"); if (prefab == null) { return; } m_cubes = new List <ModelCube>(); for (int i = 0; i < m_info.Cubes.Count; ++i) { CubeModelData data = m_info.Cubes[i]; if (data == null) { continue; } ModelCube cube = GameObject.Instantiate <ModelCube>(prefab); cube.transform.parent = transform; cube.transform.localPosition = data.Pos; cube.ModelData = data; m_cubes.Add(cube); UpdateWHD(cube); } }
private void CheckInput() { if(MainCamera == null || Target == null) return; if(Input.GetKey(KeyCode.D)) { m_inputState = InputState.Deletion; } else if(Status == GameStatus.Editor && Input.GetKey(KeyCode.A)) { m_inputState = InputState.Addition; } else if(Input.GetKey(KeyCode.W)) { m_inputState = InputState.Mark; } else m_inputState = InputState.None; if(m_clickable && Input.GetMouseButtonDown(0)) { //从摄像机发出到点击坐标的射线 Ray ray = MainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if(Physics.Raycast(ray, out hitInfo, 100f, 1<<8)) { //划出射线,只有在scene视图中才能看到 Debug.DrawLine(ray.origin, hitInfo.point); ModelCube target = hitInfo.collider.gameObject.GetComponent<ModelCube>(); if(target != null) { Vector3 point = target.transform.InverseTransformPoint(hitInfo.point); switch(m_inputState) { case InputState.Mark: //cube.Mark(); break; case InputState.Deletion: Target.DeleteCube(target); break; case InputState.Addition: CubeFaceType face = ClickFace(point); Target.AddCube(target, face); break; }//end switch }//end null }//end ray }//end buttondown }
//删除方块 public bool DeleteCube(ModelCube target) { if (!m_editable) { return(false); } if (m_cubes.Contains(target)) { if (m_cubes.Count == 1) { return(false); } m_cubes.Remove(target); UpdateWHD(target); } target.Break(); return(true); }
//更新长宽高 private void UpdateWHD(ModelCube cube) { //标记原点或者顶点 if (cube.ModelData.Pos.x < m_origin.x) { m_origin.x = cube.ModelData.Pos.x; } else if (cube.ModelData.Pos.x > m_peak.x) { m_peak.x = cube.ModelData.Pos.x; } if (cube.ModelData.Pos.y < m_origin.y) { m_origin.y = cube.ModelData.Pos.y; } else if (cube.ModelData.Pos.y > m_peak.y) { m_peak.y = cube.ModelData.Pos.y; } ; if (cube.ModelData.Pos.z < m_origin.z) { m_origin.z = cube.ModelData.Pos.z; } else if (cube.ModelData.Pos.z > m_peak.z) { m_peak.z = cube.ModelData.Pos.z; } Vector3 temp = m_peak - m_origin; m_info.Width = (int)temp.x + 1; m_info.Heigth = (int)temp.y + 1; m_info.Depth = (int)temp.z + 1; Debug.Log("origin:" + m_origin.ToString() + "peak:" + m_peak.ToString()); }
public bool AddCube(ModelCube target, CubeFaceType face) { if (!m_editable) { return(false); } ModelCube prefab = Resources.Load <ModelCube>("Prefabs/ModelCube"); if (prefab == null) { return(false); } int current = 1; Vector3 offset = Vector3.right; switch (face) { case CubeFaceType.Top: offset = Vector3.up; current = m_info.Heigth; break; case CubeFaceType.Bottom: offset = Vector3.down; current = m_info.Heigth; break; case CubeFaceType.Front: offset = Vector3.forward; current = m_info.Depth; break; case CubeFaceType.Back: offset = Vector3.back; current = m_info.Depth; break; case CubeFaceType.Right: offset = Vector3.right; current = m_info.Width; break; case CubeFaceType.Left: offset = Vector3.left; current = m_info.Width; break; } if (current >= GameConst.CubeMax) { return(false); } CubeModelData data = new CubeModelData(); data.Pos = target.ModelData.Pos + offset; m_info.Cubes.Add(data); ModelCube cube = GameObject.Instantiate <ModelCube>(prefab); cube.transform.parent = transform; cube.transform.localPosition = data.Pos; cube.ModelData = data; m_cubes.Add(cube); UpdateWHD(cube); return(true); }