Unityでコッホ曲線（前編）

[【完走目指す】初心者が25日で強くなる Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aruhitoganbaru)
22日目です。
大学で学んだ知識をアウトプットします。
# コッホ曲線とは
棒があります
![コッホ棒１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/c01b123a-da1a-4c59-d480-e1a725c6a706.png)
この棒が、
![コッホ棒２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/62687fa7-f76e-8bb7-c542-5188b88c6d1f.png)
こんな感じになります（イメージです。適当に作ったので、ちゃんと線分が1/3になってません。）
要は、線を1/3ずつに切り分けて、真ん中の部分を正三角形みたいにとがらせます。
これを何度も続けることで、トゲトゲな図形ができます。
詳しくは、フラクタルについて調べれば出ると思います。
# Unityでどのように作るか
ボタンを押すたびに動作が行われるようにします。
１．線を用意する。
これ
![スクリーンショット_20221223_001310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/d4595253-79c8-4a84-582d-451567569971.png)
こんなsquareを用意しました。
見やすいように色を付けています。
この線が最初の部分になります
次に、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/a7bad185-d78f-0325-06d0-127d4336cd66.png)
これを作ります。
一回動作が済んだ後の、(1/3)*4のものになります。
2.書く
### 注意
以下は間違ったコードでした。
修正前のものです。
このまま再生すると、Unity自体がフリーズします。
##### セーブはしておきましょう
↓間違えたコード
線につけるやつ
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Kohho : MonoBehaviour
{
    public GameObject Kohho2;
    public bool Ugoki;
    // Start is called before the first frame update
    void Start()
    {
        

       


    }

    // Update is called once per frame
    void Update()
    {
        if (Ugoki == true)
        {
            Instantiate(Kohho2, this.transform.position, this.transform.rotation);
            Destroy(this.gameObject);
            Ugoki = false;
        }
      
    }
}

```
ボタンにけるやつ
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BtnPush : MonoBehaviour
{
    public Kohho[] kh;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void Onclick()
    {
        kh[0].Ugoki = true;
        kh[1].Ugoki = true;
        kh[2].Ugoki = true;
        kh[3].Ugoki = true;
    }
}
```
Destroyが初めて出てきました。
その単語の通り、破壊します。カッコ内のオブジェクトを消してくれます。
SetActiveとかと違って、Scene上から完全に消滅します。
では、再生してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/b00d82ca-1e8f-0741-1d77-f2c256cad271.png)
なんか違う動きをしてるし、バラバラに動いています。
これはこれできれいだけど。
## 原因
複製されたオブジェクトがさらに別のオブジェクトを生み出して、連鎖していました。
オブジェクト自体に複製をつけると連鎖してしまう可能性があるので、ボタンが複製をしてくれるようにします。
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BtnPush : MonoBehaviour
{
    public GameObject[] kh;
    public GameObject Kohho2;
    public GameObject kohho;
    public bool Ugoki;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void Onclick()
    {
       
            Instantiate(Kohho2, kh[0].transform.position, kh[0].transform.rotation);

        Instantiate(Kohho2, kh[1].transform.position, kh[1].transform.rotation);
        Instantiate(Kohho2, kh[2].transform.position, kh[2].transform.rotation);
        Instantiate(Kohho2, kh[3].transform.position, kh[3].transform.rotation);

        Destroy(kohho.gameObject);
            Ugoki = false;
      
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/34c1a3ef-d3d2-47a7-12aa-4e7ed88bba75.png)
khはコッホ２を構成する、それぞれの線です。
これで実行すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/402dc3c3-50b1-eec9-5c0c-d13752237b02.png)
ボタンで少し隠れているけど、一回動作が行われた状態のコッホ曲線が出ます。
ボタンを押すと、
![スクリーンショット_20221223_014245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/85e55525-efbd-0c76-90a7-2f33530e5651.png)
なんだこれと言ってしまいそうになりますが、実はScaleを変えてやると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/3b12a0e2-0828-e71f-ff84-5c05ec40547e.png)
ちゃんとできてました。
では、scaleを変えます。
文全体が変わりましたので、再度載せておきます。
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BtnPush : MonoBehaviour
{
    public GameObject[] kh;
    public GameObject Kohho2;
    public GameObject kohho;
    public bool Ugoki;
    public GameObject[] Kohho3;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void Onclick()
    {
       
        Kohho3[0]=Instantiate(Kohho2, kh[0].transform.position, kh[0].transform.rotation);

        Kohho3[1]=Instantiate(Kohho2, kh[1].transform.position, kh[1].transform.rotation);
       Kohho3[2]= Instantiate(Kohho2, kh[2].transform.position, kh[2].transform.rotation);
       Kohho3[3]= Instantiate(Kohho2, kh[3].transform.position, kh[3].transform.rotation);
        Kohho3[0].transform.localScale = new Vector3(Kohho2.transform.localScale.x * 0.333f, Kohho2.transform.localScale.y * 0.333f, 0);
        Kohho3[1].transform.localScale = new Vector3(Kohho2.transform.localScale.x * 0.333f, Kohho2.transform.localScale.y * 0.333f, 0);
        Kohho3[2].transform.localScale = new Vector3(Kohho2.transform.localScale.x * 0.333f, Kohho2.transform.localScale.y * 0.333f, 0);
        Kohho3[3].transform.localScale = new Vector3(Kohho2.transform.localScale.x * 0.333f, Kohho2.transform.localScale.y * 0.333f, 0);
        Destroy(kohho.gameObject);
            
      
    }
}
```
scaleはlocalScaleで取得するみたいです。Vector3が使えます。
これで再生してボタンを押すと、


![スクリーンショット_20221223_020238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/1546d983-6c75-4fca-0c2a-146aaf39dfde.png)

できました！一応完成です。
# 新たな問題
では、さらに細かくできるでしょうか。
残念ながら、今のコードではできません。
ではさらに作り直していくわけですが、今回はここまで
# まとめなど
Unityでも、コッホ曲線は作れる。
Sccaleの変更の仕方、Destroyの使いかたを学んだ

22日目　終わり