本文へスキップ
🎮

📘 Unity ハンズオン · はじめての C#

Unityではじめてのスクリプト — 3Dモデルをゆっくり回転させる

Create → C# Script から、Update で transform.Rotate まで。キューブがゆっくり回るところまで!

ゴールは「再生ボタンを押すとキューブが一定の速さで回り続ける」こと。 Shader・物理・入力はまだ出しません。スクリプトの骨格に集中しましょう。

自己紹介

ココ先生(講師)・喜ぶ
ココ先生やさしい講師
今回はいちばん短い C# スクリプトからスタートです。用語は少なめ、手は動かしめでいきましょう。
はじめちゃん(学習者)・笑う
はじめちゃんUnity習い始めたて
コードを書くのはほぼ初めてですが、コピペじゃなくて意味もつかみたい派です!

オープニング対談

ココ先生(講師)・楽しむ
ココ先生今日はね、キューブちゃんをコツコツ回転させるだけ。でもここに Update や deltaTime って、あとであちこちで効いてくる重要ワードがそろってるの。
はじめちゃん(学習者)・驚く
はじめちゃんえ、回すだけでそんなに?
ココ先生(講師)・喜ぶ
ココ先生うん。「毎フレームちょっと動く」を自分の手で書けると、移動もアニメも全部つながるよ ✨

🎁このレッスンのおみやげ(学べること)

  • 📄 C# スクリプトの作り方と名前付け
  • 🧩 MonoBehaviour を継承
  • 🔁 Update の役割
  • 🧭 transform.Rotate
  • ⏱️ Time.deltaTime の意味
  • 🔧 [SerializeField] で Inspector から調整

このページは Unity + C# 向けです。 MonoBehaviour.Update Transform.Rotate が中心です。

Unity 6 / 2022 LTS 系を想定。メニュー名は多少違う場合があります。

1👋導入 — いまからやること

シーン上の キューブ にスクリプトをアタッチし、再生中だけゆっくり回転させます。移動や当たり判定はまだ触れません。

こんな人におすすめ

Unity のウィンドウは触ったことがあるが、自分で C# を書くのは初めて/ほぼ初めて、という方。

2🎬流れをつかむ

下のインフォグラフィックは「スクリプトがシーンに載るまで」の流れです。英語ラベルはエディタ表記に合わせています。

スクリプト作成、アタッチ、Update、Rotate の4ステップのインフォグラフィック
4 ステップ:作成 → アタッチ → 毎フレーム更新 → 角度を足す
Script 作成Assets に .cs
Cube に貼るInspector
PlayGame ビュー
くるくるY 軸まわり

画面幅に応じて折り返します。横スクロールは不要です。

3🧰出てくるキーワード(カード)

用語に慣れておくと、次のレッスンにすんなり入れます。

📜
MonoBehaviour Unity が呼んでくれる土台

MonoBehaviour を継承すると、Update などの特別な名前のメソッドがタイミングよく呼ばれます。

🔁
Update 毎フレームのメインループ

ゲームが動いているあいだ、何度も何度も呼ばれます。回転・移動の「続き」をここに書くと分かりやすいです。

🧭
transform いまの位置・向き

このオブジェクトの Transform コンポーネント。回転をいじるなら transform.Rotate など。

⏱️
Time.deltaTime 直近フレームの秒数

速い PC ほど 1 フレームが短いので、角度に 掛け算して「秒速」をそろえます。

🎛️
SerializeField Inspector に出す

[SerializeField]private でも Inspector から数値をいじれるので試行が速いです。

🌍
Space.Self vs World

Space.Self は自分の軸周り、Space.World はワールド座標の軸周りです。今回は Self でOK。

4🧱シーンの準備

新規 3D(アプリ)プロジェクトでもサンプルシーンでも構いません。次がそろっていれば十分です。

床・キューブ・メインカメラ・ディレクショナルライトの概念図
床代わりの Plane / Cube、回したい Cube、Main Camera、Directional Light
  • ヒエラルキーに Cube を1つ(名前は RotateTarget など分かりやすく)
  • 見え方を確認するため Main CameraDirectional Light があること
  • キューブが原点付近で見える位置に置かれていること

5📎スクリプト SlowRotate.cs

Project ウィンドウで 右クリック → Create → C# Script。名前は SlowRotate にすると、中のクラス名とそろえやすいです。

SlowRotate.cs
C#
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エディタでの手順

  1. 上記の SlowRotate.cs を保存(Ctrl+S)。エラーが出たら Console を確認。
  2. ヒエラルキーの Cube を選び、SlowRotate を Inspector にドラッグするか Add Component から追加。
  3. Inspector に出た Degrees Per Second で X/Y/Z を試す(例:Y=90 や X=20,Y=30 など)。
  4. Play を押し、Game ビューでキューブがなめらかに回れば成功。

8動作確認チャレンジ

余力的に試せるミニチャレンジです。

  • Y を 0 にして X だけ 60 にしてみる(縦回転っぽく見える)
  • 同じスクリプトを別の Cube にも付け、速度を変えて compare
  • Space.SelfSpace.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🚀次のステージへ

COMIC MODEキャラ対談で復習

ココ先生と はじめちゃんのワンポイント漫談。

はじめちゃん(学習者)・混乱
はじめちゃんdeltaTime って、毎フレームちょっと違うんですか?
ココ先生(講師)・喜ぶ
ココ先生そう。PC が忙しいと1フレームが少し長くなることもあって、その秒数が毎回ちょっと変わるの。だから「毎フレームの回転量=秒速×deltaTime」で仲良くするの。
はじめちゃん(学習者)・笑う
はじめちゃんなるほど、足し算の速さをそろえるための掛け算だったんですね!

🎮理解チェック(3問)

答えを選んでから「正解を見る」で解説をどうぞ。

1

クイズ

Q1. 毎フレーム呼ばれて、ゲームの進行に合わせて動きを更新するのに向いているメソッドは?

2

クイズ

Q2. フレームレートが変わっても「1秒あたり同じ速さ」で回したいとき、角度に掛け合わせるのは?

3

クイズ

Q3. オブジェクト自身の向きで回すとき、Rotate の第2引数に渡す列挙型は?