Skip to content

Commit

Permalink
U#チュートリアル追加 (#1)
Browse files Browse the repository at this point in the history
* U#チュートリアル追加

* U#チュートリアルに文言を追加 (#7)

* Update docs/world/udon/usharp_tutorial/03_class_definition.md

---------

Co-authored-by: GlinT <[email protected]>
  • Loading branch information
takana-v and GlinTFraulein authored Mar 23, 2024
1 parent 2b1709f commit 17ad3f7
Show file tree
Hide file tree
Showing 13 changed files with 415 additions and 0 deletions.
32 changes: 32 additions & 0 deletions docs/world/udon/usharp_tutorial/00_prepare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
title: '事前準備'
sidebar_label: '事前準備'
sidebar_position: 1
---

## UdonSharpのインストール

SDKのバージョンが3.4.0よりも新しい場合、UdonSharpはSDKに同梱されているため、インストール作業は不要です。

3.3.0よりも古いSDKを使っている場合は、Creator Companionよりインストールを行ってください。

## テキストエディタのインストール

ファイルの編集に使うソフトをインストールします。

(Windows標準のメモ帳ソフトでも編集はできますが、機能が貧弱なので、専用のソフトを別途インストールすることを推奨します)

よくおススメされるソフトは以下の2つです。

- Visual Studio Code
- Visual Studio

### Visual Studio Code

[Visual Studio Code のインストール方法](https://qiita.com/YurimyMiyu/items/5ce7821f1e3e5905c3ee)を参照し、インストールしてください。

その後、[Unity用の設定](https://nobushiueshi.com/unityvisual-studio-code%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%81%AE%E6%89%8B%E9%A0%86/)を行ってください。

### Visual Studio

Visual Studio派の人が後で書いてくれることを期待しておきます。
19 changes: 19 additions & 0 deletions docs/world/udon/usharp_tutorial/01_create_file.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
title: 'UdonSharpファイルの作成'
sidebar_label: 'UdonSharpファイルの作成'
sidebar_position: 2
---

UnityのProjectウインドウで右クリックし、「Create」→「U# Script」をクリックしてください。

すると、エクスプローラーの画面が開くので、ファイル名を指定し、「保存」をクリックします。

今回は、「MyFirstUdon」としました。

以下のように、2つのファイルが生成されればOKです。

![asset and cs file](/img/world/udon/usharp_tutorial/01_create_file/asset_and_cs_file.png)

なお、「Create」→「VRChat」→「Udon」「U# Program Asset」をクリックしてUdonSharpファイルを作成すべき**ではありません**

この方法では、「U# Program Asset」に紐づけられるC# Scriptファイルが生成されないためです。
81 changes: 81 additions & 0 deletions docs/world/udon/usharp_tutorial/02_read_file.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
title: 'UdonSharpファイルを読んでみよう'
sidebar_label: 'UdonSharpファイルを読んでみよう'
sidebar_position: 3
---

先ほど作成したファイルを開いてみましょう。

大きく#の文字が書かれている方のファイルをダブルクリックして開きます。

![program](/img/world/udon/usharp_tutorial/02_read_file/program.png)

こんな感じのプログラムが書かれています。

この中身を読み解くための基礎知識を、今から紹介します。

## UdonSharpの基礎知識

### UdonSharpとは?

(この項の内容は、今後登場するであろうUdon2には当てはまらない内容です。)

Unityでは、C#というプログラム言語を用いて、プログラミングを行います。
しかし、ビルドという仕組みの都合やセキュリティ面で、VRChatのワールド製作では、C#をそのまま使えません。

そこで、VRChat社が開発したのが、「Udon」という仕組みです。

独自形式のファイル「Udon Assembly」をVRChatクライアント(のUdon VM)が読み込むことで、Udon Assemblyに書かれた内容のプログラムが実行されます。
このUdon Assemblyを、C#のプログラムのファイルから生成してくれるのが、UdonSharpです。
(ちなみに、Udon Graphの場合でも、最終的にはUdon Assemblyとなります。)

## C#の基礎知識

### オブジェクト

C#は、オブジェクト指向という考え方に基づいて作られています。
(詳しくは説明しません。知りたい人は、「C# オブジェクト指向」とかでググりましょう)

とりあえず知っておかなければならないことは、我々が操作をする対象を「オブジェクト」という、ということです。

例えば、Transformコンポーネントはオブジェクトです。
我々は、Transformコンポーネントに対して、回転をかけたり、移動したりなど、様々な操作を行います。

### クラス

このオブジェクトを作るための設計図を、「クラス」と呼びます。
クラスには、「メンバ変数」と「メソッド」の定義が含まれます。

また、クラスから作ったオブジェクトを「インスタンス」と言います。

### 名前空間とusing

クラスを、フォルダにファイルを入れるような感じで整理する仕組みが、「名前空間(namespace)」です。
この仕組みにより、同じ名前のクラスが衝突することを防ぐことができます。

名前空間は、「.」区切りで表現されます。
例えば、`System.Math`は、System名前空間に属している、Mathというクラスを表しています。

しかし、いちいち名前空間を全て記述するのは面倒なことがあります。
例えば、VRChatのAVProビデオプレイヤーのコンポーネントのクラスは、`VRC.SDK3.Video.Components.AVPro.VRCAVProVideoPlayer`です。
こんなものをいちいち書いていると、日が暮れてしまいます。

これを解決するのが、`using`構文です。
`using 名前空間;`と書くことで、このプログラム内で使う名前空間を宣言することができます。
usingした名前空間は、記述を省略することができます。

先ほどの例を用いると、`using VRC.SDK3.Video.Components.AVPro;` と書いておくと、プログラム内では、`VRCAVProVideoPlayer`だけで、VRChatのAVProビデオプレイヤーのコンポーネントのクラスを表すことができます。

## プログラムの読み取り

先ほどのプログラムを見てみましょう。

![program](/img/world/udon/usharp_tutorial/02_read_file/program.png)

5行目までが、using構文を書いている部分(usingディレクティブ)です。

7行目から13行目までが、クラスの定義となります。

皆さんが書いていくプログラムの大部分は、ここに記述することになります。

![program2](/img/world/udon/usharp_tutorial/02_read_file/program2.png)
193 changes: 193 additions & 0 deletions docs/world/udon/usharp_tutorial/03_class_definition.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
---
title: 'クラスの定義'
sidebar_label: 'クラスの定義'
sidebar_position: 4
---

まずは、クラスを定義する前に必要になる基礎知識を紹介します。

## クラスに関する基礎知識

### 変数と型

変数は、オブジェクトを入れておく箱のようなものです。

変数には、入れるデータの形式を定義しておく必要があり、この形式を「型」といいます。

多分[ここら辺の説明](https://wa3.i-3-i.info/word1603.html)が分かりやすいと思います。

### メソッド

メソッドは、クラス内部で宣言される関数(処理のまとまり)のようなものです。

メソッドは、何らかのきっかけによって呼び出されます。呼び出されてはじめて、メソッド内の処理が行われます。

逆に言えば、「メソッドを呼び出さない限り、メソッド内の処理は実行されない」とも言えます。

関数とは何?という人は、[ここら辺の説明](https://wa3.i-3-i.info/word1905.html)が分かりやすいと思います。

### クラスの継承(派生)

あるクラスから、性質を受け継いだ新しいクラスを作ることを継承と言います。

ここら辺についても難しいので、[外部サイト](https://ufcpp.net/study/csharp/oo_inherit.html)に説明を委ねます。

### static(静的)なメソッド・メンバ変数

通常のメンバ変数やメソッドを使うためには、クラスからインスタンスを作成し(もしくはどこかからインスタンスを取得し)、そのインスタンスに対して操作を行う必要があります。

しかし、static(静的:内容が変わらない)なメソッド・メンバ変数に関しては、インスタンスを作成しなくてもクラスから参照することができます。

## クラスの定義構文

基本的な形は、以下のようになります。

```csharp
アクセス修飾子 class クラス名 : 継承元クラス名
{

}
```

これを踏まえ、先ほど作ったファイルを見てみましょう。
`//`の部分はコメントで、行内でこれ以降に書いたことは、プログラムに影響を与えません。)

```csharp
public class MyFirstUdon : UdonSharpBehaviour
{
// 中略
}
```

比較しながら、各項目を説明します。

### アクセス修飾子

[https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers)

アクセス修飾子は、このクラスがどこからアクセス可能にするかの設定です。
クラスの定義の場合、基本的には「public」で構いません。

### クラス名

UdonSharpの制約で、ファイル名とクラス名は一致させなければいけません。

### 継承元クラス名

一般的なUnityのプログラムだと「MonoBehaviour」ですが、UdonSharpでは「UdonSharpBehaviour」を指定することになります。

## メソッドの定義

基本的な形は、以下のようになります。

```csharp
アクセス修飾子 返り値型 メソッド名()
{

}
```

引数を取る場合は、以下のようになります。
(引数は、「,」区切りで複数指定可能です。)

```csharp
アクセス修飾子 返り値型 メソッド名(型 引数名)
{

}
```

### アクセス修飾子(メソッド)

アクセス修飾子は、このメソッドがどこからアクセス可能にするかの設定です。
他のクラスからアクセスできるようにするには「public」、できないようにするためには「private」とします。
省略すると、private扱いとなります。

### 返り値型

メソッドが返す値の型を定義します。

組み込み型(いつでも使える型)は、以下のページに記載されています。
[https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/built-in-types](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/built-in-types)

良く使う型は以下の通りです。

| 型名 | 説明 ||
| ------ | ------------------------- | -------- |
| int | 数値(整数) | 123456 |
| float | 数値(小数) | 123.456f |
| string | 文字列 | "mozi" |
| bool | 真偽値(真:true:false| true |

その他、任意のクラスを型として指定可能です。

なにも返さないメソッドの場合は、「void」を指定します。

----

ファイルを見てみると、既に「Start」というメソッドが定義されているようですね。

アクセス修飾子は省略されているのでprivate、返り値は何も返さない(void)、メソッド名は「Start」、引数は無しのようです。

```csharp
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class MyFirstUdon : UdonSharpBehaviour
{
void Start()
{

}
}
```

## クラス変数の定義

基本的な形は、以下のようになります。

```csharp
アクセス修飾子 型 変数名;
```

定義と同時に値を代入する場合は、以下のように書きます。

```csharp
アクセス修飾子 型 変数名 = 値;
```

### アクセス修飾子(変数)

メソッドの場合とほぼ同じです。

###

この変数に入れるデータが、どのタイプなのかを定義します。

メソッドの場合とほぼ同じです。

----

実際に先ほど作ったプログラムのクラスに、クラス変数を追加してみましょう。

今回は、アクセス修飾値がpublic、型がstring(文字列)、変数名が「firstVariable」、値が「"first udonsharp variable"」の変数を追加します。

注:基本的に、上からクラス変数→メソッドの順に定義します。そのため、Startメソッドの上に新しく変数を追加しています。

```csharp
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class MyFirstUdon : UdonSharpBehaviour
{
public string firstVariable = "first udonsharp variable";
void Start()
{

}
}
```
29 changes: 29 additions & 0 deletions docs/world/udon/usharp_tutorial/04_event.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
title: 'イベント'
sidebar_label: 'イベント'
sidebar_position: 4
---

さて、前のページの最後で、既に「Start」というメソッドが定義されていたと書きました。

なぜこんな名前のメソッドが既に定義されていたのかは、「イベント」という概念に起因します。

「イベント」は、メソッドを呼び出す代表的な方法のひとつです。

## イベント駆動型、という考え方

Unityのプログラミングでは、一般的なプログラミングとは異なる、「イベント駆動」という考えを使います。

これは、何か特定のイベントが起きた時に、特定のメソッド(イベント関数)がUnityにより呼び出され、処理が行われるという流れを指します。

(例:ワールドに入った時、特定のボタンが押された時、プレイヤーがJoinした時…)

| いつ呼び出されるか | メソッド名(イベント関数) |
| ------------------------------------ | ------------------------ |
| スクリプトが有効になったとき(一度のみ) | Start() |
| 毎フレーム | Update() |

注:基本的にイベント関数は何も返さない(void)
注2:デフォルトでスクリプトおよびスクリプトを付けたGameObjectが有効な場合、Startイベントは、「ワールドに入った時」と言い換えることができる。

イベントについては、本ページのリファレンスの方に[専用のページ](/world/udon/reference/event)があるので、そちらも参照してください。
Loading

0 comments on commit 17ad3f7

Please sign in to comment.