Skip to content

Wednesday1112/Unity

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 

Repository files navigation

目錄

摺紙互動

鳥模型

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;
        }
    }
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published