using Oculus.Interaction;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
using TMPro;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
[RequireComponent(typeof(MeshCollider))]
public class bird_VR : MonoBehaviour
{
public GameObject vertexBallPrefab; // 用於顯示圓球的預製件
//public Material lineMaterial; // 用於線條的材質
//public float lineWidth = 0.01f; // 線條寬度
//public Material frontMaterial; // 正面材質
//public Material backMaterial; // 背面材質
public Material paperMaterial;
private Mesh mesh;
private Vector3[] vertices;
private int[] triangles;
private bool isDragging = false;
private Vector3 initialControlPos;
private int selectedVertexIndex = -1;
float accumulatedRotation = 0f;
private float maxRotationAngle = 179f; // 最大旋轉角度
private GameObject[] vertexBalls; // 用於存儲實例化的圓球對象
//private LineRenderer[] lineRenderers; // 用於畫線的 LineRenderer
public int step = 1;
public float speed = 50;
public int status = 1;
public GameObject text;
public GameObject finish;
public GameObject close;
public GameObject[] FoldSteps;
LineArrow LineArrow = new LineArrow();
public GameObject center;
void Start()
{
// 定義頂點
vertices = new Vector3[27];
vertices[0] = new Vector3(0.232233f, 1.267767f, 0.000000f);
vertices[1] = new Vector3(1.292893f, 1.707107f, 0.000000f);
vertices[2] = new Vector3(2.000000f, -2.000000f, 0.000000f);
vertices[3] = new Vector3(-0.086583f, -2.000000f, 0.000000f);
vertices[4] = new Vector3(1.500000f, 1.500000f, 0.000000f);
vertices[5] = new Vector3(2.000000f, 2.000000f, 0.000000f);
vertices[6] = new Vector3(-2.000000f, 2.000000f, 0.000000f);
vertices[7] = new Vector3(-2.000000f, -0.086583f, 0.000000f);
vertices[8] = new Vector3(-0.000000f, -0.000000f, 0.000000f);
vertices[9] = new Vector3(-0.207107f, 0.207107f, 0.000000f);
vertices[10] = new Vector3(0.750000f, 0.750000f, 0.000000f);
vertices[11] = new Vector3(-0.232233f, -1.267767f, 0.000000f);
vertices[12] = new Vector3(1.707107f, 1.292893f, 0.000000f);
vertices[13] = new Vector3(-1.267767f, -0.232233f, 0.000000f);
vertices[14] = new Vector3(1.267767f, 0.232233f, 0.000000f);
vertices[15] = new Vector3(-2.000000f, -0.535534f, 0.000000f);
vertices[16] = new Vector3(2.000000f, 1.292893f, 0.000000f);
vertices[17] = new Vector3(0.207107f, -0.207107f, 0.000000f);
vertices[18] = new Vector3(2.000000f, -0.500000f, 0.000000f);
vertices[19] = new Vector3(-2.000000f, -2.000000f, 0.000000f);
vertices[20] = new Vector3(-2.000000f, -1.328097f, 0.000000f);
vertices[21] = new Vector3(1.792893f, 1.500000f, 0.000000f);
vertices[22] = new Vector3(-0.535534f, -2.000000f, 0.000000f);
vertices[23] = new Vector3(-1.328097f, -2.000000f, 0.000000f);
vertices[24] = new Vector3(1.500000f, 1.792893f, 0.000000f);
vertices[25] = new Vector3(1.292893f, 2.000000f, 0.000000f);
vertices[26] = new Vector3(-0.500000f, 2.000000f, 0.000000f);
// 定義三角形
triangles = new int[228]
{
25, 5,24,24, 5,25,
24, 5, 4, 4, 5,24,
4, 5,21,21, 5, 4,
21, 5,16,16, 5,21,
21,16,12,12,16,21, 12, 4,21,21, 4,12,
4, 1,24,24, 1, 4, 1,25,24,24,25, 1,
1, 0,26,26, 0, 1, 26,25, 1, 1,25,26,
6,26, 0, 0,26, 6, 6, 0, 9, 9, 0, 6,
0, 1, 4, 4, 1, 0, 4,10, 0, 0,10, 4,
10, 4,12,12, 4,10, 12,14,10,10,14,12,
12,16,18,18,16,12, 18,14,12,12,14,18,
14,18, 2, 2,18,14, 2,17,14,14,17, 2,
17, 8,10,10, 8,17, 10,14,17,17,14,10,
8, 9, 0, 0, 9, 8, 0,10, 8, 8,10, 0,
6, 9,13,13, 9, 6, 13, 7, 6, 6, 7,13,
7,13,15,15,13, 7,
15,13,20,20,13,15,
20, 8,19,19, 8,20, 13, 9, 8, 8, 9,13, 13, 8,20,20, 8,13,
8,17,11,11,17, 8, 8,11,23,23,11, 8, 23,19, 8, 8,19,23,
17, 2, 3, 3, 2,17, 3,11,17,17,11, 3,
11, 3,22,22, 3,11,
11,22,23,23,22,11};
// 初始化 Mesh
mesh = new Mesh();
mesh.name = "sean";
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals(); // 確保法線計算正確
// 設置 MeshFilter 和 MeshCollider
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
/*List<int> frontTriangles = new List<int>();
List<int> backTriangles = new List<int>();
for (int i = 0; i < 228; i += 6)
{
frontTriangles.Add(triangles[i]);
frontTriangles.Add(triangles[i + 1]);
frontTriangles.Add(triangles[i + 2]);
backTriangles.Add(triangles[i]);
backTriangles.Add(triangles[i + 2]);
backTriangles.Add(triangles[i + 1]);
}
Debug.Log("Front Triangles: " + string.Join(", ", frontTriangles));
Debug.Log("Back Triangles: " + string.Join(", ", backTriangles));
mesh.subMeshCount = 2;
mesh.SetTriangles(frontTriangles.ToArray(), 0);
mesh.SetTriangles(backTriangles.ToArray(), 1);
GetComponent<MeshRenderer>().materials = new Material[] { frontMaterial, backMaterial };*/
GetComponent<MeshRenderer>().materials = new Material[] { paperMaterial };
// 創建圓球對象
CreateVertexBalls(5);
// 初始化 LineRenderers
//InitializeLineRenderers();
FoldSteps[0].SetActive(true);
center.GetComponent<LineRenderer>().enabled = true;
}
void Update()
{
if (status != 0)
{
if (step == 1) LineArrow.lineArrow(1, center.transform);
else if (step == 2) LineArrow.lineArrow(0, center.transform);
else if (step == 3) LineArrow.lineArrow(3, center.transform);
else if (step == 4) LineArrow.lineArrow(2, center.transform);
else if (step == 5) LineArrow.lineArrow(2, center.transform);
else if (step == 6) LineArrow.lineArrow(2, center.transform);
else if (step == 7) LineArrow.lineArrow(3, center.transform);
else if (step == 8) LineArrow.lineArrow(2, center.transform);
else if (step == 9) LineArrow.lineArrow(3, center.transform);
else if (step == 10) LineArrow.lineArrow(1, center.transform);
}
text.GetComponent<TextMeshPro>().text = "Step: " + step + "/" + TotalStep.stepAll + "\t";
if (step > 1 && FoldSteps[step - 2] != null)
{
FoldSteps[step - 2].SetActive(false);
FoldSteps[step - 1].SetActive(true);
}
if (step == TotalStep.stepAll && status == 0) {
finish.SetActive(true);
close.SetActive(false);
openRay();
}
for (int i = 0; i < vertices.Length; i++)
{
triggerStay triggerStay = vertexBalls[i].GetComponent<triggerStay>();
if (triggerStay.b)
{
selectedVertexIndex = i;
Debug.Log($"選中了頂點 {selectedVertexIndex}");
isDragging = true;
initialControlPos = OVRInput.GetLocalControllerPosition(OVRInput.Controller.RTouch);
}
}
if (selectedVertexIndex != -1)
{
triggerStay triggerStay2 = vertexBalls[selectedVertexIndex].GetComponent<triggerStay>();
Debug.Log(triggerStay2.b);
}
if (isDragging && selectedVertexIndex != -1)
{
Vector3 rightHandPosition = OVRInput.GetLocalControllerPosition(OVRInput.Controller.RTouch) - initialControlPos;
float rotationAnglex = rightHandPosition.x * speed; // 增加旋轉速度
float rotationAngley = rightHandPosition.y * -speed;
//Debug.Log(rightHandPosition.x);
// 根據選中的頂點進行旋轉
if (selectedVertexIndex == 5 && step == 1)
{
float newnewRotation = accumulatedRotation + rotationAngley;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle)
{
UpdateVertexBalls(5);
Quaternion rot = Quaternion.AngleAxis(rotationAngley, vertices[2] - vertices[6]);
vertices[5] = rot * (vertices[5] - vertices[6]) + vertices[6];
vertices[25] = rot * (vertices[25] - vertices[6]) + vertices[6];
vertices[24] = rot * (vertices[24] - vertices[6]) + vertices[6];
vertices[21] = rot * (vertices[21] - vertices[6]) + vertices[6];
vertices[16] = rot * (vertices[16] - vertices[6]) + vertices[6];
vertices[1] = rot * (vertices[1] - vertices[6]) + vertices[6];
vertices[4] = rot * (vertices[4] - vertices[6]) + vertices[6];
vertices[12] = rot * (vertices[12] - vertices[6]) + vertices[6];
vertices[26] = rot * (vertices[26] - vertices[6]) + vertices[6];
vertices[0] = rot * (vertices[0] - vertices[6]) + vertices[6];
vertices[10] = rot * (vertices[10] - vertices[6]) + vertices[6];
vertices[14] = rot * (vertices[14] - vertices[6]) + vertices[6];
vertices[18] = rot * (vertices[18] - vertices[6]) + vertices[6];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(5);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 5 && step == 2)
{
float newnewRotation = accumulatedRotation + rotationAngley;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle)
{
UpdateVertexBalls(5);
Quaternion rot = Quaternion.AngleAxis(rotationAngley, vertices[18] - vertices[26]);
vertices[5] = rot * (vertices[5] - vertices[26]) + vertices[26];
vertices[25] = rot * (vertices[25] - vertices[26]) + vertices[26];
vertices[24] = rot * (vertices[24] - vertices[26]) + vertices[26];
vertices[21] = rot * (vertices[21] - vertices[26]) + vertices[26];
vertices[16] = rot * (vertices[16] - vertices[26]) + vertices[26];
vertices[1] = rot * (vertices[1] - vertices[26]) + vertices[26];
vertices[4] = rot * (vertices[4] - vertices[26]) + vertices[26];
vertices[12] = rot * (vertices[12] - vertices[26]) + vertices[26];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(6);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 6 && step == 3)
{
float newnewRotation = accumulatedRotation + rotationAnglex;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle)
{
UpdateVertexBalls(6);
Quaternion rot = Quaternion.AngleAxis(rotationAnglex, vertices[5] - vertices[19]);
vertices[6] = rot * (vertices[6] - vertices[19]) + vertices[19];
vertices[25] = rot * (vertices[25] - vertices[19]) + vertices[19];
vertices[24] = rot * (vertices[24] - vertices[19]) + vertices[19];
vertices[1] = rot * (vertices[1] - vertices[19]) + vertices[19];
vertices[0] = rot * (vertices[0] - vertices[19]) + vertices[19];
vertices[9] = rot * (vertices[9] - vertices[19]) + vertices[19];
vertices[13] = rot * (vertices[13] - vertices[19]) + vertices[19];
vertices[7] = rot * (vertices[7] - vertices[19]) + vertices[19];
vertices[15] = rot * (vertices[15] - vertices[19]) + vertices[19];
vertices[20] = rot * (vertices[20] - vertices[19]) + vertices[19];
vertices[26] = rot * (vertices[26] - vertices[19]) + vertices[19];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(6);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 6 && step == 4)
{
UpdateVertexBalls(6);
float newnewRotation = accumulatedRotation + rotationAnglex;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle)
{
Quaternion rot = Quaternion.AngleAxis(rotationAnglex, vertices[5] - vertices[15]);
vertices[6] = rot * (vertices[6] - vertices[15]) + vertices[15];
vertices[25] = rot * (vertices[25] - vertices[15]) + vertices[15];
vertices[7] = rot * (vertices[7] - vertices[15]) + vertices[15];
vertices[26] = rot * (vertices[26] - vertices[15]) + vertices[15];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(2);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 2 && step == 5)
{
float newnewRotation = accumulatedRotation + rotationAnglex;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle)
{
UpdateVertexBalls(2);
Quaternion rot = Quaternion.AngleAxis(rotationAnglex, vertices[22] - vertices[5]);
vertices[2] = rot * (vertices[2] - vertices[5]) + vertices[5];
vertices[16] = rot * (vertices[16] - vertices[5]) + vertices[5];
vertices[18] = rot * (vertices[18] - vertices[5]) + vertices[5];
vertices[3] = rot * (vertices[3] - vertices[5]) + vertices[5];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(22);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 22 && step == 6)
{
float newnewRotation = accumulatedRotation + rotationAnglex;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle - 130)
{
UpdateVertexBalls(22);
Quaternion rot = Quaternion.AngleAxis(rotationAnglex, vertices[19] - vertices[5]);
vertices[22] = rot * (vertices[22] - vertices[5]) + vertices[5];
vertices[21] = rot * (vertices[21] - vertices[5]) + vertices[5];
vertices[12] = rot * (vertices[12] - vertices[5]) + vertices[5];
vertices[17] = rot * (vertices[17] - vertices[5]) + vertices[5];
vertices[14] = rot * (vertices[14] - vertices[5]) + vertices[5];
vertices[11] = rot * (vertices[11] - vertices[5]) + vertices[5];
vertices[3] = rot * (vertices[3] - vertices[5]) + vertices[5];
vertices[23] = rot * (vertices[23] - vertices[5]) + vertices[5];
vertices[2] = rot * (vertices[2] - vertices[5]) + vertices[5];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(15);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 22 && step == 7)
{
float newnewRotation = accumulatedRotation + rotationAnglex;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle)
{
UpdateVertexBalls(22);
Quaternion rot = Quaternion.AngleAxis(rotationAnglex, vertices[23] - vertices[11]);
vertices[22] = rot * (vertices[22] - vertices[11]) + vertices[11];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(15);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 15 && step == 8)
{
float newnewRotation = accumulatedRotation + rotationAnglex;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle)
{
UpdateVertexBalls(15);
Quaternion rot = Quaternion.AngleAxis(rotationAnglex, vertices[20] - vertices[13]);
vertices[15] = rot * (vertices[15] - vertices[13]) + vertices[13];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(11);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 11 && step == 9)
{
float newnewRotation = accumulatedRotation + rotationAnglex;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle - 130)
{
UpdateVertexBalls(11);
Quaternion rot = Quaternion.AngleAxis(rotationAnglex, vertices[19] - vertices[5]);
vertices[22] = rot * (vertices[22] - vertices[5]) + vertices[5];
vertices[21] = rot * (vertices[21] - vertices[5]) + vertices[5];
vertices[12] = rot * (vertices[12] - vertices[5]) + vertices[5];
vertices[17] = rot * (vertices[17] - vertices[5]) + vertices[5];
vertices[14] = rot * (vertices[14] - vertices[5]) + vertices[5];
vertices[11] = rot * (vertices[11] - vertices[5]) + vertices[5];
vertices[3] = rot * (vertices[3] - vertices[5]) + vertices[5];
vertices[23] = rot * (vertices[23] - vertices[5]) + vertices[5];
vertices[2] = rot * (vertices[2] - vertices[5]) + vertices[5];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(5);
step++;
accumulatedRotation = 0;
}
}
else if (selectedVertexIndex == 5 && step == 10 && status==1)
{
float newnewRotation = accumulatedRotation + rotationAngley;
if (Mathf.Abs(newnewRotation) <= maxRotationAngle - 110)
{
UpdateVertexBalls(5);
Quaternion rot = Quaternion.AngleAxis(rotationAngley, vertices[4] - new Vector3(vertices[4].x, vertices[4].y, vertices[4].z + 1));
vertices[5] = rot * (vertices[5] - vertices[4]) + vertices[4];
Quaternion rot1 = Quaternion.AngleAxis(rotationAngley, vertices[4] - vertices[10]);
vertices[21] = rot1 * (vertices[21] - vertices[4]) + vertices[4];
Quaternion rot2 = Quaternion.AngleAxis(-rotationAngley, vertices[4] - vertices[10]);
vertices[24] = rot2 * (vertices[24] - vertices[4]) + vertices[4];
accumulatedRotation = newnewRotation;
}
else
{
UpdateVertexBalls(-1);
status = 0;
accumulatedRotation = 0;
center.GetComponent<LineRenderer>().enabled = false;
}
}
mesh.vertices = vertices;
mesh.RecalculateNormals();
initialControlPos = OVRInput.GetLocalControllerPosition(OVRInput.Controller.RTouch);
}
// 更新 LineRenderers
//UpdateLineRenderers();
if (OVRInput.GetUp(OVRInput.Button.PrimaryIndexTrigger))
{
isDragging = false;
selectedVertexIndex = -1;
}
}
private void CreateVertexBalls(int n)
{
// 清除之前的圓球
if (vertexBalls != null)
{
foreach (GameObject ball in vertexBalls)
{
if (ball != null)
{
Destroy(ball);
}
}
}
// 創建新的圓球
vertexBalls = new GameObject[vertices.Length];
for (int i = 0; i < vertices.Length; i++)
{
Vector3 position = transform.TransformPoint(vertices[i]);
vertexBalls[i] = Instantiate(vertexBallPrefab, position, Quaternion.identity);
vertexBalls[i].name = "Ball" + i;
vertexBalls[i].AddComponent<SphereCollider>();
vertexBalls[i].AddComponent<triggerStay>();
vertexBalls[i].transform.parent = transform;
vertexBalls[i].SetActive(false);
}
vertexBalls[n].SetActive(true);
vertexBallPrefab.SetActive(false);
}
private void UpdateVertexBalls(int n)
{
// 更新每個圓球的位置
for (int i = 0; i < vertices.Length; i++)
{
if (vertexBalls[i] != null)
{
vertexBalls[i].transform.position = transform.TransformPoint(vertices[i]);
if (i == n)
{
vertexBalls[i].SetActive(true);
}
else vertexBalls[i].SetActive(false);
}
}
}
/*private void InitializeLineRenderers()
{
// 確保有足夠的 LineRenderer
lineRenderers = new LineRenderer[48];
for (int i = 0; i < lineRenderers.Length; i++)
{
GameObject lineObject = new GameObject("Line" + i);
lineObject.transform.parent = transform;
lineRenderers[i] = lineObject.AddComponent<LineRenderer>();
lineRenderers[i].material = lineMaterial;
lineRenderers[i].widthMultiplier = lineWidth;
lineRenderers[i].positionCount = 2;
}
}*/
/*private void UpdateLineRenderers()
{
// 更新每個 LineRenderer 的位置
if (lineRenderers != null)
{
lineRenderers[0].SetPosition(0, transform.TransformPoint(vertices[5]));
lineRenderers[0].SetPosition(1, transform.TransformPoint(vertices[25]));
lineRenderers[1].SetPosition(0, transform.TransformPoint(vertices[5]));
lineRenderers[1].SetPosition(1, transform.TransformPoint(vertices[24]));
lineRenderers[2].SetPosition(0, transform.TransformPoint(vertices[5]));
lineRenderers[2].SetPosition(1, transform.TransformPoint(vertices[4]));
lineRenderers[3].SetPosition(0, transform.TransformPoint(vertices[5]));
lineRenderers[3].SetPosition(1, transform.TransformPoint(vertices[21]));
lineRenderers[4].SetPosition(0, transform.TransformPoint(vertices[5]));
lineRenderers[4].SetPosition(1, transform.TransformPoint(vertices[16]));
lineRenderers[5].SetPosition(0, transform.TransformPoint(vertices[25]));
lineRenderers[5].SetPosition(1, transform.TransformPoint(vertices[24]));
lineRenderers[6].SetPosition(0, transform.TransformPoint(vertices[24]));
lineRenderers[6].SetPosition(1, transform.TransformPoint(vertices[4]));
lineRenderers[7].SetPosition(0, transform.TransformPoint(vertices[4]));
lineRenderers[7].SetPosition(1, transform.TransformPoint(vertices[21]));
lineRenderers[8].SetPosition(0, transform.TransformPoint(vertices[21]));
lineRenderers[8].SetPosition(1, transform.TransformPoint(vertices[16]));
lineRenderers[9].SetPosition(0, transform.TransformPoint(vertices[16]));
lineRenderers[9].SetPosition(1, transform.TransformPoint(vertices[12]));
lineRenderers[10].SetPosition(0, transform.TransformPoint(vertices[12]));
lineRenderers[10].SetPosition(1, transform.TransformPoint(vertices[4]));
lineRenderers[11].SetPosition(0, transform.TransformPoint(vertices[4]));
lineRenderers[11].SetPosition(1, transform.TransformPoint(vertices[1]));
lineRenderers[12].SetPosition(0, transform.TransformPoint(vertices[1]));
lineRenderers[12].SetPosition(1, transform.TransformPoint(vertices[25]));
lineRenderers[13].SetPosition(0, transform.TransformPoint(vertices[25]));
lineRenderers[13].SetPosition(1, transform.TransformPoint(vertices[26]));
lineRenderers[14].SetPosition(0, transform.TransformPoint(vertices[1]));
lineRenderers[14].SetPosition(1, transform.TransformPoint(vertices[0]));
lineRenderers[15].SetPosition(0, transform.TransformPoint(vertices[4]));
lineRenderers[15].SetPosition(1, transform.TransformPoint(vertices[10]));
lineRenderers[16].SetPosition(0, transform.TransformPoint(vertices[12]));
lineRenderers[16].SetPosition(1, transform.TransformPoint(vertices[14]));
lineRenderers[17].SetPosition(0, transform.TransformPoint(vertices[16]));
lineRenderers[17].SetPosition(1, transform.TransformPoint(vertices[18]));
lineRenderers[18].SetPosition(0, transform.TransformPoint(vertices[26]));
lineRenderers[18].SetPosition(1, transform.TransformPoint(vertices[6]));
lineRenderers[19].SetPosition(0, transform.TransformPoint(vertices[0]));
lineRenderers[19].SetPosition(1, transform.TransformPoint(vertices[9]));
lineRenderers[20].SetPosition(0, transform.TransformPoint(vertices[10]));
lineRenderers[20].SetPosition(1, transform.TransformPoint(vertices[8]));
lineRenderers[21].SetPosition(0, transform.TransformPoint(vertices[14]));
lineRenderers[21].SetPosition(1, transform.TransformPoint(vertices[17]));
lineRenderers[22].SetPosition(0, transform.TransformPoint(vertices[18]));
lineRenderers[22].SetPosition(1, transform.TransformPoint(vertices[2]));
lineRenderers[23].SetPosition(0, transform.TransformPoint(vertices[6]));
lineRenderers[23].SetPosition(1, transform.TransformPoint(vertices[7]));
lineRenderers[24].SetPosition(0, transform.TransformPoint(vertices[9]));
lineRenderers[24].SetPosition(1, transform.TransformPoint(vertices[13]));
lineRenderers[25].SetPosition(0, transform.TransformPoint(vertices[8]));
lineRenderers[25].SetPosition(1, transform.TransformPoint(vertices[19]));
lineRenderers[26].SetPosition(0, transform.TransformPoint(vertices[17]));
lineRenderers[26].SetPosition(1, transform.TransformPoint(vertices[11]));
lineRenderers[27].SetPosition(0, transform.TransformPoint(vertices[2]));
lineRenderers[27].SetPosition(1, transform.TransformPoint(vertices[3]));
lineRenderers[28].SetPosition(0, transform.TransformPoint(vertices[26]));
lineRenderers[28].SetPosition(1, transform.TransformPoint(vertices[0]));
lineRenderers[29].SetPosition(0, transform.TransformPoint(vertices[0]));
lineRenderers[29].SetPosition(1, transform.TransformPoint(vertices[10]));
lineRenderers[30].SetPosition(0, transform.TransformPoint(vertices[10]));
lineRenderers[30].SetPosition(1, transform.TransformPoint(vertices[14]));
lineRenderers[31].SetPosition(0, transform.TransformPoint(vertices[14]));
lineRenderers[31].SetPosition(1, transform.TransformPoint(vertices[18]));
lineRenderers[32].SetPosition(0, transform.TransformPoint(vertices[6]));
lineRenderers[32].SetPosition(1, transform.TransformPoint(vertices[9]));
lineRenderers[33].SetPosition(0, transform.TransformPoint(vertices[9]));
lineRenderers[33].SetPosition(1, transform.TransformPoint(vertices[8]));
lineRenderers[34].SetPosition(0, transform.TransformPoint(vertices[8]));
lineRenderers[34].SetPosition(1, transform.TransformPoint(vertices[17]));
lineRenderers[35].SetPosition(0, transform.TransformPoint(vertices[17]));
lineRenderers[35].SetPosition(1, transform.TransformPoint(vertices[2]));
lineRenderers[36].SetPosition(0, transform.TransformPoint(vertices[13]));
lineRenderers[36].SetPosition(1, transform.TransformPoint(vertices[7]));
lineRenderers[37].SetPosition(0, transform.TransformPoint(vertices[13]));
lineRenderers[37].SetPosition(1, transform.TransformPoint(vertices[15]));
lineRenderers[38].SetPosition(0, transform.TransformPoint(vertices[13]));
lineRenderers[38].SetPosition(1, transform.TransformPoint(vertices[20]));
lineRenderers[39].SetPosition(0, transform.TransformPoint(vertices[11]));
lineRenderers[39].SetPosition(1, transform.TransformPoint(vertices[23]));
lineRenderers[40].SetPosition(0, transform.TransformPoint(vertices[11]));
lineRenderers[40].SetPosition(1, transform.TransformPoint(vertices[22]));
lineRenderers[41].SetPosition(0, transform.TransformPoint(vertices[11]));
lineRenderers[41].SetPosition(1, transform.TransformPoint(vertices[3]));
lineRenderers[42].SetPosition(0, transform.TransformPoint(vertices[3]));
lineRenderers[42].SetPosition(1, transform.TransformPoint(vertices[22]));
lineRenderers[43].SetPosition(0, transform.TransformPoint(vertices[22]));
lineRenderers[43].SetPosition(1, transform.TransformPoint(vertices[23]));
lineRenderers[44].SetPosition(0, transform.TransformPoint(vertices[23]));
lineRenderers[44].SetPosition(1, transform.TransformPoint(vertices[19]));
lineRenderers[45].SetPosition(0, transform.TransformPoint(vertices[19]));
lineRenderers[45].SetPosition(1, transform.TransformPoint(vertices[20]));
lineRenderers[46].SetPosition(0, transform.TransformPoint(vertices[20]));
lineRenderers[46].SetPosition(1, transform.TransformPoint(vertices[15]));
lineRenderers[47].SetPosition(0, transform.TransformPoint(vertices[15]));
lineRenderers[47].SetPosition(1, transform.TransformPoint(vertices[7]));
}
}*/
public void openRay()
{
GameObject OrigamiRoom_UI = GameObject.Find("OrigamiRoom_UI");
if (OrigamiRoom_UI != null)
{
RayInteractable script = OrigamiRoom_UI.GetComponent<RayInteractable>();
script.enabled = true;
}
}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class triggerStay : MonoBehaviour
{
Collider a;
public bool b = false;
void Start()
{
a = GetComponent<Collider>();
}
void OnTriggerStay(Collider a)
{
//Debug.Log("碰到");
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)) // 檢測板機按鈕
{
// 執行物件被點擊時的行為
b = true;
//Debug.Log("按下");
}
else if (OVRInput.GetUp(OVRInput.Button.PrimaryIndexTrigger)) b = false;
}
void OnTriggerExit(Collider a)
{
b = false;
}
}using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class LineArrow : MonoBehaviour
{
//public Transform center;
Vector3 startPoint;
Vector3 endPoint;
public float arrowLong = 0.5f;
public float arrowHeadLength = 0.5f; // 箭頭頭部的長度
public float arrowHeadAngle = 50f; // 箭頭頭部的角度
LineRenderer lineRenderer;
public void lineArrow(int t, Transform center)
{
Vector3 right = Vector3.zero;
Vector3 left = Vector3.zero;
lineRenderer = center.GetComponent<LineRenderer>();
lineRenderer.positionCount = 5; // 主線段 + 兩條箭頭
if (center == null)
{
Debug.Log("center = null");
return;
}
if (t == 0 || t == 1)
{
if (t == 0) //上
{
startPoint = center.position - new Vector3(0, arrowLong, 0);
endPoint = center.position + new Vector3(0, arrowLong, 0);
}
else if (t == 1) //下
{
startPoint = center.position + new Vector3(0, arrowLong, 0);
endPoint = center.position - new Vector3(0, arrowLong, 0);
}
// 計算方向
Vector3 direction = (endPoint - startPoint).normalized;
// 計算箭頭頭部
right = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) * Vector3.forward;
left = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) * Vector3.forward;
}
else if (t == 2 || t == 3)
{
if (t == 2) //右
{
startPoint = center.position - new Vector3(arrowLong, 0, 0);
endPoint = center.position + new Vector3(arrowLong, 0, 0);
}
else if (t == 3) //左
{
startPoint = center.position + new Vector3(arrowLong, 0, 0);
endPoint = center.position - new Vector3(arrowLong, 0, 0);
}
// 計算方向
Vector3 direction = (endPoint - startPoint).normalized;
// 計算箭頭頭部
right = Quaternion.LookRotation(direction) * Quaternion.Euler(180 + arrowHeadAngle, 0, 0) * Vector3.forward;
left = Quaternion.LookRotation(direction) * Quaternion.Euler(180 - arrowHeadAngle, 0, 0) * Vector3.forward;
}
// 設置線段的點
lineRenderer.SetPosition(0, startPoint);
lineRenderer.SetPosition(1, endPoint);
lineRenderer.SetPosition(2, endPoint + right * arrowHeadLength);
lineRenderer.SetPosition(3, endPoint);
lineRenderer.SetPosition(4, endPoint + left * arrowHeadLength);
/*lineRenderer.SetPosition(4, startPoint);
lineRenderer.SetPosition(5, endPoint);
lineRenderer.SetPosition(6, endPoint + left * arrowHeadLength);*/
}
}using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class plant : MonoBehaviour
{
private int[] list1;
private bool[] ConfirmationArray;
private int score;
private int BugReCon;
private float myTimer;
private int SpawnNum;
private List<GameObject> bug = new List<GameObject>();
public GameObject bugPrefab;
public TextMeshProUGUI ShowScore;
private Vector3[] plantPos;
private List<GameObject> plantObj = new List<GameObject>();
public GameObject myPlantPrefab;
public GameObject myPlant;
public GameObject myPlantText;
public GameObject myPlantPrefab2;
public GameObject myPlantPrefab3;
public GameObject myPlantPrefab4;
public GameObject myHarvest;
public GameObject myHarvestText;
public GameObject myCook;
public GameObject myCookText;
public GameObject rice;
public GameObject duck4;
public GameObject cookedDuck;
public GameObject duck1;
public GameObject duck2;
void Start()
{
SpawnNum = 0;
BugReCon = 0;
myTimer = 0.0f;
score = 0;
list1 = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
ConfirmationArray = new bool[list1.Length];
for(int i=0; i<9; i++) bug.Add(bugPrefab);
plantPos = new[] {
new Vector3( -1.4f, 3.46f, 0f),
new Vector3( 0f, 3.46f, 0f),
new Vector3( 1.33f, 3.46f, 0f),
new Vector3( -1.4f, 2.08f, 0f),
new Vector3( 0f, 2.08f, 0f),
new Vector3( 1.33f, 2.08f, 0f),
new Vector3( -1.4f, 0.7f, 0f),
new Vector3( 0f, 0.7f, 0f),
new Vector3( 1.33f, 0.7f, 0f),
};
}
void Update()
{
if (BugReCon > 0)///蟲的生成控制
{
if (myTimer > 1.0f)///生成間隔時間
{
myTimer = 0.0f;
int RandomNumber = Random.Range(0, list1.Length);
while (ConfirmationArray[RandomNumber] == true)///生成位置不重複
{
if (SpawnNum < 9)///避免生成次數>=9時會無限循環
{
RandomNumber = Random.Range(0, list1.Length);
}
else
{
break;
}
}
if (SpawnNum < 9)///生成次數大於9時停止生成
{
GameObject newobj = Instantiate(bugPrefab, plantPos[RandomNumber], bugPrefab.transform.rotation);
bug[RandomNumber] = newobj;
}
SpawnNum++;
ConfirmationArray[RandomNumber] = true;
}
else
{
myTimer = myTimer + Time.deltaTime;
}
}
}
public void onPlant()
{
BugReCon++;///開始生蟲
for (int i=0; i<9; i++)
{
GameObject newObj = Instantiate(myPlantPrefab, plantPos[i], myPlantPrefab.transform.rotation);
plantObj.Add(newObj);
}
myPlant.SetActive(false);
myPlantText.SetActive(false);
Invoke("duck2Show", 2f);
Invoke("grow", 2f);
}
public void grow()
{
for(int i=0; i<9; i++)
{
Destroy(plantObj[i]);
}
for(int i=0; i < 9; i++)
{
GameObject newObj = Instantiate(myPlantPrefab2, plantPos[i], myPlantPrefab2.transform.rotation);
plantObj.Add(newObj);
}
Invoke("grow2", 2f);
}
public void grow2()
{
for (int i = 9; i < 18; i++)
{
Destroy(plantObj[i]);
}
for (int i = 0; i < 9; i++)
{
GameObject newObj = Instantiate(myPlantPrefab3, plantPos[i], myPlantPrefab3.transform.rotation);
plantObj.Add(newObj);
}
myHarvest.SetActive(true);
myHarvestText.SetActive(true);
}
public void onHarvest()
{
BugReCon = 0;
for (int i = 0; i < 9; i++) Destroy(bug[i]);
for (int i = 18; i < 27; i++)
{
Destroy(plantObj[i]);
}
GameObject newObj = Instantiate(myPlantPrefab4, myPlantPrefab4.transform.position, myPlantPrefab4.transform.rotation);
plantObj.Add(newObj);
myHarvest.SetActive(false);
myHarvestText.SetActive(false);
myCook.SetActive(true);
myCookText.SetActive(true);
}
public void onCook()
{
Destroy(plantObj[27]);
Instantiate(rice, rice.transform.position, rice.transform.rotation);
//Invoke("riceShow", 2f);
myCook.SetActive(false);
myCookText.SetActive(false);
duck4.SetActive(false);
cookedDuck.SetActive(true);
}
/*public void riceShow()
{
Instantiate(rice, rice.transform.position, rice.transform.rotation);
}*/
public void reset()///重製次數和位置
{
ConfirmationArray = new bool[list1.Length];
SpawnNum = 0;
}
private void OnTriggerEnter2D(Collider2D collision)///蟲子消失
{
Destroy(gameObject, 0f);
}
/*public void showscore()///記分板數字
{
score++;
ShowScore.text = score.ToString();
}*/
public void duck2Show()
{
duck1.SetActive(false);
duck2.SetActive(true);
}
}using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class duck : MonoBehaviour
{
public GameObject[] duckPrefab = new GameObject[3];
private int i = 1;
private int feedCount = 0;
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnTriggerEnter2D(Collider2D collision)
{
feedCount++;
if(feedCount > 1)
{
duckPrefab[i-1].SetActive(false);
duckPrefab[i].SetActive(true);
i++;
feedCount = 0;
}
}
}