Udon#を勉強する会(第10回)UIを作り、発射カウントを表示させるギミック
この記事はシリーズものです
この記事単独では完結していないのでご注意ください
記事作成日
2025/04/20
Unity2022.3.22f1
今回の概要
キューブが発射されるスクリプト(スクリプト1)
キューブの発射カウントを増やす関数を呼び出す
発射ギミックは前回のものです
GameData=データ保管庫 (スクリプト2)
キューブの発射カウントを増やす処理はここで実行される
スコアボードに表示されている数字を増やす関数を呼び出す
スコアボード(スクリプト3)
スコアボードに表示されている数字を増やす処理はここで行う
スコアボードに表示されている数値を増やす処理を行う
※なんで3つに分けたのかというと
スコアボード、発射ギミック、データ保管庫の3つに分けた方が実践で使いやすい、管理しやすいからだそうです
やること
キューブ発射システムは前回の記事を見てください
概要
親キューブにc#スクリプトを付ける
子キューブを親の子供にする
表示されるスコアボードを作る
Unityのhierarchy上で右クリック → UI → Legacy → Text
Canvasとその子供にText(TMP)が作成される
同じくヒエラルキーで右クリック → UI → EventSystem
でEventSystemを作成
警告マークがでてるのでボタンを押して対応
UIの調整
Canvas
hierarchyでCanvasをクリック、inspectorの中のCanvas、RenderModeをWorld-Space(ワールドの設置物)に設定
この時、Canvasの外枠が表示されない人はSceneタブの表示設定を見てください
ONにすると表示されます
Rect Transformの中のScaleで大きさを調整
PosX、PosY,PosZの数値で位置を調整する(例として0,2,0)
Add ComponentでVRC UI Sharpeを追加する
※VRChat用で表示するために必要
inspectorの上の端のLayerをUIからDefaultに変更
注意が出てくるがYes…を選択
※子供も同じ設定にするか聞いている
VRCでコントローラーで青いレーザーポインターを当てるために必要な設定
Textの文字を調整
Text(Legacy)をhierarchyでクリック、inspectorを見て
表示の文字を変える
Text Inputの下の白枠に文字を入れる
文字とCanvasの位置を合わせる
Rect TransformのPosx Posy Poszで調整できる
基本0、0、0にしてから調整すると良い
表示範囲を拡大する
Rect TransformのWidthとHeightで調整できる
文字のサイズを変更する
TextMeshProの中のMain SettingsのFpnt Sizeで変更可能
データ保管庫の空のオブジェクトを作る
Unityのhierarchyで右クリック→Create Emptyで空のゲームオブジェクトを作成できる
名前をGameDataに設定
GameDataにinspectorからUdon Bihaviourコンポーネントを付ける
Program Sourceの下をUdon C# Program Assetに変更してからNew Programを押す
GaneData Udon C# Program AsstがAsset(指定した場所)に作成される
作成される場所は
Assets > Sceanes > VRCDefaultWorldScene_UdonProgramSource > GaneData Udon C# Program
GameDataのうどんBehaviourのCreate Scriptを押す
コンパイルが長めに走るので待つ
警告文がでているので消す(ConsoloeタブのClear
ここまででGameObjectにスクリプトを書く準備ができました
Visual StudioでGameData.csを開く
開き方はAssetsの中のGameData.csをダブルクリック
※以前作ったプログラムと混合しないように!@@@@@@@@@@@@@@@@
public int useCount = 0;
[SerializeField] private UdonBehaviour scorBoard;
//scorBoardの変数がどこにも使われていないからつけた?
public void CountUpUseCount()
{
useCount++;
scorBoard.SendCustomEvent("UpdateUiText");
Debug.Log("チェックポイント2");
}
保存してコンパイル
あとでGameData(Script)のScorBoardのゲームオブジェクトを割り当てるのを忘れずに
発射システムに発射カウント機能を付ける
親キューブのスクリプトを書く
Void Start の中には書かない事
//ここからPart10
[SerializeField] private GameObject miniCube;
//子Cubeにアクセスするために使用
[SerializeField] private Rigidbody miniCubeRigidBody;
//子CubeのIskinematicを後でOFFにするために使用
[SerializeField] private UdonBehaviour gameData;
//パート11でUseCountにアクセスするため
public override void OnPickupUseDown()
{
//base.OnPickupUseDown();
//上の行は消す
//オブジェクトを持った後に左クリックを押すと走る処理
miniCube.transform.parent = null;
//minicubeの親子関係を切っている=キューブを持った時に親子関係が切れて別々に動けるようになる
miniCubeRigidBody.isKinematic = false;
//子キューブのIskinematicをOFFにして物理演算を有効化
miniCubeRigidBody.AddForce(miniCube.transform.forward * 500);
//子キューブのRigidBodyに力を加える。MiniCubeの位置、前方に500の力
gameData.SendCustomEvent("CountUpUseCount");
//part11 他のC#の関数を呼び出す文""の中に呼び出す関数の名前が入る
}
public override void OnPickupUseUp()
{
//base.OnPickupUseUp();
//上の行は消す
//オブジェクトを持った後に左クリックを放した時に走る処理
miniCube.transform.parent = this.gameObject.transform;
//元に戻す処理を開始、親Cubeと子Cubeの親子関係を再設定
miniCube.transform.localPosition = new Vector3(0, 0, 1);
//子Cubeの位置を親の所(初期設定の位置)に戻す
miniCube.transform.localRotation = Quaternion.identity;
//物理演算で回転も変わっているので初期設定に戻す
miniCubeRigidBody.isKinematic = true;
//物理演算を有効化していたので無効化にする
}
保存してコンパイル
親キューブのスクリプトコンポーネントにGameDataが追加されているのでhierarchyのGameDataオブジェクトをドラッグ&ドロップで割り当てる
Canvas(ScoreBoard)の作業2(主にカウント数の表示プログラム)
hierarchyでCanvasをScoreBoardに変更
inspectorでUdon Behaviourを追加
Progaram SouceがUdon C# Program assetになっているのを確認してNew Programを押す
ScoreBoardのC#を開く
Class6直下に以下の文をTextまで書く
Textにマウスを合わせて考えられる修正内容を表示するをクリック
using UnityEngine.UI;をクリック
Classの上の文に
using UnityEngine.UI;
が追加されていたらOK
UIのText型の変数が使えるようになる
※上の行に直接文を書いてもエラーになる
以下の文をコピペする前に上記作業を必ずすること
[SerializeField] private Text uiText;
//UIのTextは子オブジェクトなのでアクセスできるようにしている
[SerializeField] private UdonBehaviour gameData;
//カウントする処理はGameDbjectのC#にあるのでそれにアクセスする
public void UpdateUiText()
{
int useCount = (int)gameData.GetProgramVariable("useCount");
// ここだけ使えるint型の変数(int useCount)を宣言、int型にキャスト(指定?)してuseCount関数を処理して代入
uiText.text = "useCount:" + useCount;
Debug.Log("カウント");
// useCountという文字とカウント数を表示させたいため
//string型+int型をやっても自動で全部string型にしてくれる
//uiText.text = gameData.GetProgramVariable("useCount").ToString();
//(修正前)textという名の変数、型はuiText、中は他のC#から呼び出したuseCount、string型に指定
}
保存してコンパイルしたら
Score Board(Script)の中の
Ui Text に hierarchyのText(Legacy)
GameDataにhierarchyのGameDataを割り当て
後回しにしていたもの
GameDataをhierarchyで選択
inspectorを見てGameData(Script)の中のScoreBoardにhierarchyのScoreBoardを割り当てる
これで完成です
デバッグ
親キューブは持てるか?持ってクリックボタンを離しても保持しているか?
再び左クリックを押しっぱなしで子キューブが発射されるか?
スコアボードのカウント数が増えたか?
左クリックを離すと子キューブが戻ってくるか?
注意事項
関数、変数の名前が間違えやすいので動かない時は特に注意
Scriptの中の変数にゲームオブジェクトは全て割り当ているか?
メモ
int型は初期値がゼロなので
public int useCount = ;
0を省略する書き方もある
関数を使う
関数とは1まとめにしたプログラム文のこと
/public void CountUpUseCount()
{
}
CountUpUseCount()が関数の設定で
CountUpUseCountが関数の名前
{}の中身が処理するプログラムになります
VoidとReturn
変数は代入すると値を返すことが必要になる
Void は一方通行ができる処理
String型のメッセージを代入など
Returnは処理の結果を変数に入れる処理
値を返す文
useCount++;
useCount = UseCount +1;
useCount +=1
3つ全て同じ意味
++はインクリメントと呼ぶ
GetProgramVariable("")
他のC#の変数を読み込む文
元の変数の型までは認識してない
.ToString()
強制的にString型に変更する文
例えば12ならintでもstringでも使えるけどこの文で
String型の12に定義できる
ディスカッション
コメント一覧
まだ、コメントがありません