📘 Unity ハンズオン · はじめての C#
Unityではじめてのスクリプト — 3Dモデルをゆっくり回転させる
Create → C# Script から、Update で transform.Rotate まで。キューブがゆっくり回るところまで!
ゴールは「再生ボタンを押すとキューブが一定の速さで回り続ける」こと。 Shader・物理・入力はまだ出しません。スクリプトの骨格に集中しましょう。
自己紹介
オープニング対談
🎁このレッスンのおみやげ(学べること)
- 📄 C# スクリプトの作り方と名前付け
- 🧩
MonoBehaviourを継承 - 🔁
Updateの役割 - 🧭
transform.Rotate - ⏱️
Time.deltaTimeの意味 - 🔧
[SerializeField]で Inspector から調整
このページは Unity + C# 向けです。 MonoBehaviour.Update と Transform.Rotate が中心です。
Unity 6 / 2022 LTS 系を想定。メニュー名は多少違う場合があります。
1👋導入 — いまからやること
シーン上の キューブ にスクリプトをアタッチし、再生中だけゆっくり回転させます。移動や当たり判定はまだ触れません。
こんな人におすすめ
2🎬流れをつかむ
下のインフォグラフィックは「スクリプトがシーンに載るまで」の流れです。英語ラベルはエディタ表記に合わせています。
画面幅に応じて折り返します。横スクロールは不要です。
3🧰出てくるキーワード(カード)
用語に慣れておくと、次のレッスンにすんなり入れます。
MonoBehaviour を継承すると、Update などの特別な名前のメソッドがタイミングよく呼ばれます。
ゲームが動いているあいだ、何度も何度も呼ばれます。回転・移動の「続き」をここに書くと分かりやすいです。
このオブジェクトの Transform コンポーネント。回転をいじるなら transform.Rotate など。
速い PC ほど 1 フレームが短いので、角度に 掛け算して「秒速」をそろえます。
[SerializeField] で private でも Inspector から数値をいじれるので試行が速いです。
Space.Self は自分の軸周り、Space.World はワールド座標の軸周りです。今回は Self でOK。
4🧱シーンの準備
新規 3D(アプリ)プロジェクトでもサンプルシーンでも構いません。次がそろっていれば十分です。
- ヒエラルキーに Cube を1つ(名前は
RotateTargetなど分かりやすく) - 見え方を確認するため Main Camera と Directional Light があること
- キューブが原点付近で見える位置に置かれていること
5📎スクリプト SlowRotate.cs
Project ウィンドウで 右クリック → Create → C# Script。名前は SlowRotate にすると、中のクラス名とそろえやすいです。
using UnityEngine;
/// <summary>
/// 毎フレーム、少しずつこのオブジェクトを回転させます。
/// Time.deltaTime を掛けると、PC の速さ(FPS)に依存しにくくなります。
/// </summary>
public class SlowRotate : MonoBehaviour
{
[Header("回転速度(1秒あたりの角度・度)")]
[Tooltip("Y 軸周りなら横回転。X なら前後に倒れます。")]
[SerializeField] private Vector3 degreesPerSecond = new Vector3(0f, 45f, 0f);
private void Update()
{
// 1フレーム分の角度 = 1秒あたりの角度 × 前フレームからの経過秒
transform.Rotate(degreesPerSecond * Time.deltaTime, Space.Self);
}
}6🔍コードの読み方
- class SlowRotate : MonoBehaviour … このファイルは「コンポーネントとして置ける C# クラス」です。
- SerializeField … Unity がシリアライズして Inspector にフィールドを表示します。public にしない理由は、 他スクリプトから勝手に触られにくくするため、など。
- degreesPerSecond … 1 秒あたり何度回すか。
Y=45なら約 8 秒で一周のイメージ。 - transform.Rotate(···, Space.Self) … いまの向きを基準に、少しだけ回転を足します。
7✅エディタでの手順
- 上記の
SlowRotate.csを保存(Ctrl+S)。エラーが出たら Console を確認。 - ヒエラルキーの Cube を選び、
SlowRotateを Inspector にドラッグするか Add Component から追加。 - Inspector に出た Degrees Per Second で X/Y/Z を試す(例:Y=90 や X=20,Y=30 など)。
- Play を押し、Game ビューでキューブがなめらかに回れば成功。
8✨動作確認チャレンジ
余力的に試せるミニチャレンジです。
- Y を 0 にして X だけ 60 にしてみる(縦回転っぽく見える)
- 同じスクリプトを別の Cube にも付け、速度を変えて compare
Space.SelfをSpace.Worldに変えて挙動の違いを眺める(戻すのを忘れずに)
9🩹つまずきポイント
- 再生しても動かない … スクリプトが Cube に付いているか、Console に赤エラーがないか確認。
- The associated script can not be loaded … クラス名とファイル名が一致しているか確認。
- 回転が速すぎ / 遅すぎ …
degreesPerSecondの数値か、Time.deltaTimeを付け忘れていないか確認。 - Scene ビューでは見えるのに Game では見えない … Camera の向き・キューブの位置を確認。
10🏆まとめ
- C# スクリプトを作り、MonoBehaviour の
Updateに処理を書いた transform.Rotateで向きを少しずつ変えたTime.deltaTimeで FPS に依存しにくい回転にした[SerializeField]で Inspector から試せるようにした
11🚀次のステージへ
- クリックした床の位置へキャラを移動(Raycast)
- キー入力で回転速度を変える(
Inputまたは Input System) - 別オブジェクトを親にして、太陽系みたいに「公転+自転」を足す
COMIC MODEキャラ対談で復習
ココ先生と はじめちゃんのワンポイント漫談。
🎮理解チェック(3問)
答えを選んでから「正解を見る」で解説をどうぞ。
クイズ
Q1. 毎フレーム呼ばれて、ゲームの進行に合わせて動きを更新するのに向いているメソッドは?
クイズ
Q2. フレームレートが変わっても「1秒あたり同じ速さ」で回したいとき、角度に掛け合わせるのは?
クイズ
Q3. オブジェクト自身の向きで回すとき、Rotate の第2引数に渡す列挙型は?
