// Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 20)) { GameObject selectedObj = hit.collider.gameObject; /* * TRubikElement2 elem = selectedObj.transform.parent.GetComponent<TRubikElement2>(); * elem.Select(); * //TRubikCreator.TRubik.TRubikElement rubikElement = selectedObj.transform.parent.GetComponent("TRubikElement") as TRubikCreator.TRubik.TRubikElement; * //rubikElement.Select(); * Debug.Log(hit.ToString()); */ TRubikCubik cubik = selectedObj.transform.parent.GetComponent <TRubikCubik>(); if (SelectedCubic != null) { Rubik.SelectAvailablePlanes(ref SelectedCubic, false); } SelectedCubic = cubik; Rubik.SelectAvailablePlanes(ref cubik, true); } } }
public TRotationPlane FindPlane(ref TRubikCubik cubik, ref List <TRotationPlane> planes) { for (int i = 0; i < planes.Count; ++i) { TRotationPlane plane = planes[i]; foreach (TRubikCubik rc in plane.Elements) { if (rc == cubik) { return(plane); } } } return(null); }
public void SelectRotationPlane(ref List <TRotationPlane> planes, ref TRubikCubik cubik, bool select) { TRotationPlane plane = FindPlane(ref cubik, ref planes); if (plane == null) { Debug.Log("Can't find plane"); return; } foreach (TRubikCubik rc in plane.Elements) { if (select) { rc.Select(); } else { rc.UnSelect(); } } }
public static TRubik2 CreateRubik(Vector3 center, float elementSize, GameObject prefab) { int centerIndex = (Dimension - 1) / 2; float startShift = elementSize * (((float)Dimension - 1) / 2); Vector3 startPos = center - new Vector3(startShift, startShift, startShift); TRubik2 res = new TRubik2(); int nameIndex = 0; for (int i = 0; i < Dimension; ++i) { //int j = 0; for (int j = 0; j < Dimension; ++j) { //int k = 0; for (int k = 0; k < Dimension; ++k) { string name = nameIndex.ToString(); nameIndex += 1; // skip center cube if (i == centerIndex && j == centerIndex && k == centerIndex) { // add fake element res.GOBS.Add(new GameObject()); continue; } Vector3 smallCubCenter = startPos + new Vector3(elementSize * i, elementSize * j, elementSize * k); TRubikCubik smallCubik = CreateSmallCubik(smallCubCenter, center, prefab, elementSize, ref name); res.Elements.Add(smallCubik); res.GOBS.Add(smallCubik.HolderObject); //ProcessSides(smallCubCenter, //break; } } } // rotation planes for (int i = 0; i < Dimension; ++i) { //int j = 0; TRotationPlane xPlane = new TRotationPlane(); TRotationPlane yPlane = new TRotationPlane(); TRotationPlane zPlane = new TRotationPlane(); for (int j = 0; j < Dimension; ++j) { //int k = 0; for (int k = 0; k < Dimension; ++k) { if (i == centerIndex && j == centerIndex && k == centerIndex) { continue; } TRubikCubik cubik = res.GOBS[i * Dimension * Dimension + j * Dimension + k].GetComponent <TRubikCubik>(); xPlane.Elements.Add(cubik); cubik = res.GOBS[j * Dimension * Dimension + i * Dimension + k].GetComponent <TRubikCubik>(); yPlane.Elements.Add(cubik); cubik = res.GOBS[k * Dimension * Dimension + i * Dimension + j].GetComponent <TRubikCubik>(); zPlane.Elements.Add(cubik); } } res.XPlanes.Add(xPlane); res.YPlanes.Add(yPlane); res.ZPlanes.Add(zPlane); } return(res); }
public static TRubikCubik CreateSmallCubik(Vector3 cubikCenter, Vector3 totalCenter, GameObject prefab, float elementSize, ref string name) { Vector3 vector2CubikCenter = cubikCenter - totalCenter; List <GameObject> res = new List <GameObject>(); float[] normalsValues = { -1.0f, 1.0f }; for (int i = 0; i < 3; ++i) { int colorSubIndex = 0; foreach (float normalValue in normalsValues) { Color color = Colors2[CalcColorIndex(i, colorSubIndex)]; Vector3 normal2Check = Vector3.zero; normal2Check[i] = normalValue * elementSize / 2; Vector3 normalFromPos = Vector3.zero; normalFromPos[i] = vector2CubikCenter[i]; if (i == 2) { Debug.DrawLine(cubikCenter, cubikCenter + normal2Check, Color.red); Debug.DrawLine(cubikCenter, cubikCenter + normalFromPos, Color.green); } float angle = Vector3.Angle(normal2Check, normalFromPos); // create only proper sides // calculate sides by element position float dots = Vector3.Dot(normalFromPos, normal2Check); if (angle < 90 && dots > 0) { Vector3 sidePos = cubikCenter + normal2Check; Quaternion quat = Quaternion.FromToRotation(PrefabNormal, normal2Check); //Quaternion quat = Quaternion.identity; GameObject go = (GameObject)Instantiate(prefab, sidePos, quat); go.name = name; go.GetComponent <MeshRenderer>().material.color = color; res.Add(go); } ++colorSubIndex; } } GameObject[] res2 = new GameObject[res.Count]; int l = 0; foreach (GameObject go in res) { res2[l] = go; ++l; } ; GameObject holderObject = new GameObject(); holderObject.transform.position = cubikCenter; TRubikCubik rc = holderObject.AddComponent <TRubikCubik>(); rc.Init(holderObject, res2); return(rc); }
public void SelectAvailablePlanes(ref TRubikCubik cubik, bool select) { SelectRotationPlane(ref XPlanes, ref cubik, select); SelectRotationPlane(ref YPlanes, ref cubik, select); SelectRotationPlane(ref ZPlanes, ref cubik, select); }