オブジェクトに触れると音が鳴るギミックを作る｜UdonSharpを書いてみよう(1)

#目次
1.UdonSharpを書くための準備をする
2.UdonSharpを書く
3.ボタンにするゲームオブジェクトを作る
4.ワールドを完成させる
5.動作確認
6.次回

#1.UdonSharpを書くための準備をする
##Unityで新しくプロジェクトを立ち上げる
![プロジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/6f793461-9195-61d0-97e7-68f13a46435b.png)
テンプレートは3D、
プロジェクト名はUdonなどわかりやすい名前にしておきましょう
右下の作成でプロジェクトを作成します

##VRCSDKをインポートする
プロジェクトが開いたら、VRCSDKをインポートします
VRCSDKは自分に合ったバージョンの物をインポートしましょう
__SDK3-Worlds__をもっていない場合は、[VRChat Home](https://vrchat.com/home/download)から、ダウンロードできます
インポートは、VRCSDKをUnityのAssetsへ、ドラッグアンドドロップします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/022d3654-f840-e9f0-77ae-c74d14ff635b.png)
インポートを押します
インポートが終わると、フォルダが追加されると思います

##最新のUdonSharpをダウンロードする
UdonSharpは、MerlinVRさんがGitHubで公開しているものを使います
[最新のUdonSharpをダウンロード](https://github.com/MerlinVR/UdonSharp/releases/tag/v0.20.3)
ダウンロードができると、UdonSharpのUnityPackageを、Unityにインポートします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/ed86e912-0d65-50cc-8467-59d54ba094ab.png)
インポートを押します
インポートが終わると、フォルダが追加されると思います

##UdonSharpを作るフォルダを作る
Assetsにファイルが散らばるのも嫌なので・・・
今回はAudioPalyなどの名前で、フォルダを作ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/0e1a8dd4-cd04-e49a-123c-219d62347f7e.png)
作りました

##U#Scriptを作る
AudioPlayにU#Scriptを作ります
Create/VRChat/Udon/Udon C# Program Asset
で、ProgramAssetを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/9082a9bf-1f05-3a14-0eff-3cff1c8cde0e.png)
名前は、AudioPlayとかにしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/46e9d165-ab4b-c024-49fc-010abf4c2ff9.png)
これでProgramAssetはできました
次に、ProgramAssetを開いて、Scriptを作成していきます
InspectorからCreate Scriptを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/0fce0300-a026-2f16-991a-76d6821c863f.png)
保存選択画面が出てくると思いますが、名前は最初から入力されているので、そのまま保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/525c3759-9f9c-9631-3305-e47a36163cd9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/a79afc83-2848-05b4-b2e4-5d038fb95342.png)
これでU#Scriptが完成しました

#2.UdonSharpを書く
AudioPlay.csを開きます
##変数を宣言する
オーディオを扱うために、変数を宣言します
__privateな、AudioSource型の変数__を、定義します
名前は、わかりやすい名前にしておきます
今回私は、audioSourceで宣言しました

```c#
private AudioSource audioSource;
```
これで変数はできました

##スタート時にオーディオソースを取得する
オーディオソースを取得するため、最初からあるStartメソッドに、コードを書いていきます
Scriptを入れたゲームオブジェクトに入っているオーディオソースを取得したいので、
GetComponentを使って、AudioSourceを取得します
次に、取得したオーディオソースは、audioSource変数に代入します

```c#
void Start()
{
	audioSource = GetComponent<AudioSource>();
}
```

これでオーディオソースの取得ができました

##ゲームオブジェクトをクリックできるようにする
ゲームオブジェクトをクリックしたときに、イベントを発生させるメソッドは二つあり、
MonoBehaviourに入っている__OnMouseDown__と、
UdonSharpBehaviourに入っている__Interact__があります
また、InteractはVRChat用に作られています(詳しいことはしらない、勉強不足)
今回はInteractを使います
publicな、戻り値無しの上書き可能メソッドとして、定義します

```c#
public override void Interact()
{
		
}
```
これで、クリック判定ができるようになりました

##クリックされた時の処理を書く
クリックされた時の処理は、上記で取得したオーディオを再生したいので、
AudioSource __.Play__を使って再生します
(Interactメソッドの中に書きます)

```c#
audioSource.Play();
```
これで、クリックしたときに再生されるようになりました
__スクリプトを保存して__、Unityに戻りましょう

#3.ボタンにするゲームオブジェクトを作る
##ゲームオブジェクトにスクリプトを入れる
まずは、ゲームオブジェクトを作ります
名前はAudioPlayButtonにしておきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/e2c49ab8-f161-d358-623d-0a8df8a9a07d.png)
__(コライダー判定が邪魔な人は、Box Collider の IsTriggerをオンにしましょう)__
この中に、スクリプトを入れていきます
ゲームオブジェクトに、AudioPlayスクリプトを、ドラッグアンドドロップします
ドラッグアンドドロップをすると、Convert to UdonBehaviourを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/994c4364-1b54-03cf-121e-c972849b65c8.png)
これで、Scriptが使えるようになりました
Useするときの文字を変えたい場合は、Interaction Textを書き換えることで、変更できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/32e8c967-8855-0f9e-2037-2e44784df7dc.png)

##再生するオーディオソースを入れる
オーディオソースは、[効果音ラボ](https://soundeffect-lab.info/)さんから、いただきました
今回使用した音源は、[ボタン・システム音](https://soundeffect-lab.info/sound/button/)の、[決定、ボタン押下3]を利用しました
ダウンロードがおわったら、オーディオを、ドラッグアンドドロップでインポートします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/d0488197-7a34-9c43-4206-a1acc850ee30.png)
オーディオが入ったら、このオーディオを、ゲームオブジェクトにドラッグアンドドロップします
これで、オーディオソースがはいったので、設定していきます
__Play on Awakeを外します
Priorityを0にします
Volumeを0.5にします__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/b94aebfb-4d51-17c8-5157-09ab835e520c.png)
これで設定ができました

#4.ワールドを完成させる
このままでは、地面も何もないので実行できません
地面とスポーンするためのVRCWorldを追加していきます
まずは、地面を作ります
Terrainやキューブなどで、地面を作ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/47d5f341-56a0-2af1-6fea-3d06f6fc0c74.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/cda1dfda-6b76-d723-99c9-bb747c467755.png)
地面が完成しました
次に、VRCWorldを追加して、リスポーン位置を設定します
Assets/VRChat Examples/Prefabs の中にあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/d06e3495-fd81-6214-632a-492187cf93ba.png)
これを、ドラッグアンドドロップで、Hierarchyに追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/9103913e-b6ab-1336-8bcb-073776b7819a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286080/db7deae5-c0ac-1596-d86c-bbaf7cee04af.png)
追加できました
これで、ワールドとして使えるようになりました

#5.動作確認
VRChat SDKから、Build & Testを実行します

テスト動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/S-JxD78Nw2Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

動いていれば成功です
動いてない場合は、もう一度、スクリプトを確認してみてください
お疲れさまでした

#6.次回
また何か作ります

[UdonSharpを書いてみよう(2)](https://qiita.com/Milcia/items/ce401746b3eb265c463c)