private void Awake() { // dish.transform.position = new Vector3(5.46f, 1.62f, 0); counter = 0; ss = EC.GetComponent <StoryScript>(); ec = EC.GetComponent <EventController>(); mp = gameObject.GetComponent <MakePolygon>(); backgroundBorders = new List <Vector2[]>(); backgroundMidpoints = new List <Vector2>(); // 외곽 경계값 Vector2[] tmp = { new Vector2(-3f, -2f), new Vector2(-3f, 1.8f), new Vector2(2f, 1.8f), new Vector2(2f, -2f) }; // 투렉트 Vector2[] tmp2 = { new Vector2(-3.8f, -2.2f), new Vector2(-3.8f, 1.51f), new Vector2(0.9f, 1.51f), new Vector2(0.9f, -2.2f) }; // 직투정, 합동삼각형 maxLength = new List <float>(); maxLength.Add(2.5f); maxLength.Add(2.35f); backgroundBorders.Add(tmp); backgroundBorders.Add(tmp2); // 중점 for (int j = 0; j < 2; j++) { float midpointsTmpx = 0; float midpointsTmpy = 0; for (int i = 0; i < 4; i++) { midpointsTmpx += backgroundBorders[j][i].x; midpointsTmpy += backgroundBorders[j][i].y; } backgroundMidpoints.Add(new Vector2(midpointsTmpx / 4, midpointsTmpy / 4)); } if (ec.GetdebugMode()) { Debug.Log("GameController Awake"); } return; }
public void makeNew(int gameType) { if (ec.GetdebugMode()) { Debug.Log(counter + " makeNew : " + gameType); } // counter++; foreach (GameObject p in polygonList) { Destroy(p); } polygonList.Clear(); /* * * TEST CODE : MakePolygon에서 새로운 형태 추가했을 경우 테스트하는 곳이다. * */ /*GameObject polygon = new GameObject("Polygon"); * polygon.AddComponent(System.Type.GetType("Polygon")); * Vector2[] v = MakePolygon.MakeJig(); * polygon.GetComponent<Polygon>().render(v); * polygonList.Add(polygon); * Vector2[] s = MakePolygon.MakeSquare(Polygon.jiktojunglength,0,0,0); * GameObject polygon2 = new GameObject("Polygon"); * polygon2.AddComponent(System.Type.GetType("Polygon")); * polygon2.GetComponent<Polygon>().render(s); * polygonList.Add(polygon2); * ec.Debug_KillAnswerCheck(); * return;*/ // 출제변경시 여기의 biscuitProblems 등 변수 전환 + buttoncontroller_title 변수 전환, switch (gameType) { case 0: // 예각1 vertexes = MakePolygon.MakeTriangle(1); break; case 1: // 예각2 vertexes = MakePolygon.MakeParallelogram(); break; case 2: // 직각 vertexes = MakePolygon.MakeTriangle(0); break; case 3: // 둔각 vertexes = MakePolygon.MakeTriangle(2); break; case 4: // 다각형1(사다리꼴) vertexes = MakePolygon.MakeTrapezoid(); break; case 5: // 다각형2(사각형) vertexes = MakePolygon.MakeQuadrangle(); break; case 6: // 다각형2(오각형) vertexes = MakePolygon.MakePentagon(); break; case 7: // 다각형3(육각형) vertexes = MakePolygon.MakeHexagon(); break; case 8: // 다각형3(칠각형) vertexes = MakePolygon.MakeHeptagon(); break; case 9: // 다각형3(팔각형) vertexes = MakePolygon.MakeOctagon(); break; case 10: // 직투정 vertexes = MakePolygon.MakeJig(); break; case 11: // 직투정2 vertexes = MakePolygon.MakeJig(); break; case 12: // 정투직 vertexes = MakePolygon.MakeJung(); break; } if (ec.GetdebugMode()) { Debug.Log(counter + " vertexes done"); } // normalize here // 가장 긴 변이 최대 범위의 60% ~ 67% 범위로 랜덤 비율적용되게 하고, 다른 변들도 그렇게 적용한다. if (gameType <= rec2squareProblems) // GAME TYPE HARD CODED HERE : 투렉트 + 직투정 생성 { var firstTriangle = new GameObject("Polygon"); firstTriangle.AddComponent(System.Type.GetType("Polygon")); float currmidx = 0; float currmidy = 0; for (int i = 0; i < vertexes.Length; i++) { currmidx += vertexes[i].x; currmidy += vertexes[i].y; } currmidx /= vertexes.Length; currmidy /= vertexes.Length; if (ec.GetdebugMode()) { Debug.Log(counter + "MakeNew 0"); } float backgroundMidPointx = backgroundMidpoints[gameType <= biscuitProblems ? 0 : 1].x; float backgroundMidPointy = backgroundMidpoints[gameType <= biscuitProblems ? 0 : 1].y; Vector2 diff = new Vector2(currmidx - backgroundMidPointx, currmidy - backgroundMidPointy); Vector2[] vectors = new Vector2[vertexes.Length]; float maxlength = -99999999f; for (int i = 0; i < vertexes.Length; i++) { vertexes[i].x -= diff.x; vertexes[i].y -= diff.y; vectors[i].x = vertexes[i].x - backgroundMidPointx; vectors[i].y = vertexes[i].y - backgroundMidPointy; if (Mathf.Pow(vectors[i].x, 2) + Mathf.Pow(vectors[i].y, 2) > maxlength) { maxlength = Mathf.Pow(vectors[i].x, 2) + Mathf.Pow(vectors[i].y, 2); } } if (ec.GetdebugMode()) { Debug.Log(counter + "MakeNew 1"); } float tomatch = UnityEngine.Random.Range(0.6f * maxLength[gameType <= biscuitProblems ? 0 : 1], 0.67f * maxLength[gameType <= biscuitProblems ? 0 : 1]); float proportion = 1.5f * tomatch / Mathf.Pow(maxlength, 0.5f); Polygon.jiktojunglength *= proportion; Vector2[] result = new Vector2[vertexes.Length]; for (int i = 0; i < result.Length; i++) { result[i].x = backgroundMidPointx + proportion * vectors[i].x; result[i].y = backgroundMidPointy + proportion * vectors[i].y; } if (ec.GetdebugMode()) { Debug.Log(counter + "MakeNew 2"); } /* * float tmpx = Mathf.Pow(Mathf.Pow(vertexes[0].x - vertexes[1].x, 2), 0.5f) + Mathf.Pow(Mathf.Pow(vertexes[0].y - vertexes[1].y, 2), 0.5f); * float tmpy = Mathf.Pow(Mathf.Pow(result[0].x - result[1].x, 2), 0.5f) + Mathf.Pow(Mathf.Pow(result[0].y - result[1].y, 2), 0.5f); * Debug.Log("proportion : " + proportion); * Debug.Log("before : " + tmpx + " after : " + tmpy); */ prob = result; firstTriangle.GetComponent <Polygon>().render(result); polygonList.Add(firstTriangle); // rotate here // 중심을 기준으로 점수와 콤보수에 따라 영향을 받는 회전각도를 적용한다(점수, 콤보가 높을수록 120 ~ 240도 문제가 많이 나오도록). rotateangle = UnityEngine.Random.Range(0f, 360f); firstTriangle.transform.RotateAround(new Vector3(backgroundMidPointx, backgroundMidPointy, 0), Vector3.forward, rotateangle); if (ec.GetdebugMode()) { Debug.Log(counter + "MakeNew 3"); } // 넓이를 검사해서 너무 작은 삼각형은 다시 한다. Mesh mesh = firstTriangle.GetComponent <MeshFilter>().mesh; Vector3[] meshVertices = mesh.vertices; Vector3 area = Vector3.zero; for (int p = meshVertices.Length - 1, q = 0; q < meshVertices.Length; p = q++) { area += Vector3.Cross(meshVertices[q], meshVertices[p]); } area *= 0.5f; // Debug.Log("area " + area.magnitude); if (ec.GetdebugMode()) { Debug.Log(counter + "MakeNew 4"); } if (area.magnitude < 2.4f) { // Debug.Log(counter + " remaking.."); Destroy(firstTriangle); polygonList.RemoveAt(polygonList.Count - 1); makeNew(gameType); } if (ec.GetdebugMode()) { Debug.Log(counter + "MakeNew 5"); } if (Polygon.jiktojung) { if (ec.GetdebugMode()) { Debug.Log(counter + " jiktojung true"); } GenerateSquares(); if (ec.GetdebugMode()) { Debug.Log(counter + " GenerateSquares Done"); } MakeFormulas(); } if (ec.GetdebugMode()) { Debug.Log(counter + "MakeNew 6"); } if (Polygon.jungtojik) { if (ec.GetdebugMode()) { Debug.Log(counter + " jungtojik true"); } MakeFormulasJung(); } if (ec.GetdebugMode()) { Debug.Log("counter at : " + counter); } counter++; } else { // 합동삼각형은 여기 생성부에서 자체처리 + 렌더 + 리스트추가 similarTriangles = mp.MakeSimilars(); var similarTriangle1 = new GameObject("Polygon"); var similarTriangle2 = new GameObject("Polygon"); var similarTriangle3 = new GameObject("Polygon"); similarTriangle1.AddComponent(System.Type.GetType("Polygon")); similarTriangle2.AddComponent(System.Type.GetType("Polygon")); similarTriangle3.AddComponent(System.Type.GetType("Polygon")); similarTriangle1.GetComponent <Polygon>().render(similarTriangles[0]); similarTriangle2.GetComponent <Polygon>().render(similarTriangles[1]); similarTriangle3.GetComponent <Polygon>().render(similarTriangles[2]); polygonList.Add(similarTriangle1); polygonList.Add(similarTriangle2); polygonList.Add(similarTriangle3); } return; }
public void GenerateSquares() { if (ec.GetdebugMode()) { Debug.Log("GenerateSquares"); } int howMany = (int)UnityEngine.Random.Range(3f, 5f); List <Vector2[]> Squares = new List <Vector2[]>(); List <Vector3> Collisions = new List <Vector3>(); for (int i = 0; i < howMany; i++) { try { int dummyVariable = 0; do { dummyVariable++; if (dummyVariable == 500000) { throw new Exception(); // to prevent infinite loop } Vector2 candidate = APointOnFryPan(); float length; float answerLength = Polygon.jiktojunglength; if (i == 0) { length = answerLength; // answer square size } else { if (UnityEngine.Random.Range(0f, 2f) >= 1 && Polygon.jiktojunglength >= 0.5) { length = UnityEngine.Random.Range(0.35f, Polygon.jiktojunglength - 0.14f); } else { length = UnityEngine.Random.Range(Polygon.jiktojunglength + 0.1f, 0.8f); } } // check for collision bool loopContinue = false; for (int j = 0; j < Squares.Count; j++) { if (isColliding(candidate, length * Mathf.Pow(2, 0.5f), Collisions)) { loopContinue = true; break; } } if (loopContinue) { continue; } Collisions.Add(new Vector3(length * (float)Mathf.Pow(2, 0.5f), candidate.x, candidate.y)); Squares.Add(MakePolygon.MakeSquare(length, candidate.x, candidate.y, UnityEngine.Random.Range(0f, 360f))); break; } while (true); }catch (Exception e) { if (ec.GetdebugMode()) { Debug.Log("Failed to find proper point on Frypan : Too many tries"); } howMany = Squares.Count; } } for (int i = 0; i < howMany; i++) { GameObject Square = new GameObject("Square"); Square.AddComponent <Polygon>(); Square.GetComponent <Polygon>().render(Squares[i]); polygonList.Add(Square); } return; }