スクリプトデビュー

そろそろスクリプトを使ってみようか

どんなことをやるの?

最初だから簡単に、上下左右に動かす処理を書いてみるよ。まずはプロジェクトを作成しようか。UnityHubからプロジェクト名を任意の名前にして、プロジェクトの保存先をしっかりと確認しよう。画像では、デスクトップに作成した[Unity]フォルダに保存する設定になっているね
プロジェクトを新規作成

ヒエラルキーウィンドウから〇のオブジェクトを作成しよう

まぁこれくらいは簡単ですよ

いいね。それじゃあ次はどこで何をするでしょうか?

え、え~っと……〇のオブジェクトのインスペクターから、空のScriptファイルを……とか?

その方法でも間違いではないよ。もう一つのやり方は、[Scenes]フォルダの中にScriptファイルを作る方法だね。覚えてるかな?

あ~、あったね、そんなやり方も!すっかり忘れてたよ

[Script]ファイルの名前はわかりやすい名前をつけるんだったよね。スクリプト名(クラス名)は先頭を大文字で始めて、複数の単語で構成される場合は、2つ目以降の単語の先頭を大文字にするんだったよね。物体が動くスクリプトだから、[ObjectMove]って名前にするよ

なるほど。これなら名前から、どんなスクリプトファイルなのかわかるね!

それじゃあScriptファイルを〇のオブジェクトのインスペクターに適用してみようか。適用が完了したら、スクリプトファイルを開いてみよう

スクリプトファイルを開いたよ~!

うん。ちゃんと開けてるね。それではこのスクリプトが適用されている〇のオブジェクトを動かしていこうか。どうやって動かすかわかるかな?

えぇ~、無茶ぶりすんなし……全然検討もつかないんだけど

直接答えを教えてもいいんだけど、それだと仕組みがいまいちわからないだろうから、少し回り道をするよ。Unityはゲームエンジンというものってのは紹介したよね

うん。普通に作るよりも楽にゲームを作れるようになるんでしょ?

そうそう。だけど当然ながら、UnityにはUnityの作法があるのさ。ちょっと確認してみようか。Unityのメニューからプロジェクト設定を開こう

色々な設定が確認できるんだけど、今回要があるのは、インプットに関してだからインプットマネージャーを確認してみよう
縦はVertical 横はHorizontal


水平(横)がHorizontalで、垂直(縦)がVerticalってこと?

そうなるね。横に動かしたいならHorizontalに対して力を加えたり、座標を移動したりするわけだね。Unity内部はあくまで英語のみで作られているから、エンジン内の各種要素も英語じゃないと駄目ってことなんだ

ふーむ……なるほどね。

それじゃあ、これをふまえて上下左右に動かすスクリプトを書いてみようか
上下左右に動かすスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
public float moveSpeed = 5f; // 移動速度
private Rigidbody2D rb;
private Vector2 moveInput;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// 十字キー(矢印キー / WASD でも対応可)
float moveX = Input.GetAxisRaw("Horizontal"); // 左右入力(-1, 0, 1)
float moveY = Input.GetAxisRaw("Vertical"); // 上下入力(-1, 0, 1)
// 入力をベクトルに格納
moveInput = new Vector2(moveX, moveY).normalized;
}
void FixedUpdate()
{
// 十字キーを押している間だけ移動
rb.velocity = moveInput * moveSpeed;
}
}


難しすぎわろた……FixedUpdateなんて教えてもらってないし……

Updateは入力処理の時に使うんだけど、物理処理(Rigidbody関連)の時はFixedUpdateを使うんだ。使い分けをしないと、例えばフレームレートが違う環境で(低スペックPCと高スペックPC)「速く動いたり遅く動いたり」しちゃうんだ。ちょっと難しいから、変数を日本語に書き換えてみようか
変数を日本語にしてみる
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
public float オブジェクトの速度 = 5f; // 移動速度
private Rigidbody2D 物体; //物体を入れる為の変数を用意
private Vector2 速度を入力; //入力状態を格納する変数を用意
void Start()
{
物体 = GetComponent<Rigidbody2D>(); //一番最初にRigidbody2Dを探して、変数に格納する
}
void Update()
{
// 十字キー(矢印キー / WASD でも対応可)
float 横の動き = Input.GetAxisRaw("Horizontal"); // 左右入力(-1, 0, 1) ←を押したら-1 →を押したら+1
float 縦の動き = Input.GetAxisRaw("Vertical"); // 上下入力(-1, 0, 1) ↓を押したら-1 ↑を押したら+1
// 入力をベクトルに格納
速度を入力 = new Vector2(横の動き, 縦の動き).normalized; //new Vector2とは、新しく力を加える方向性
}
void FixedUpdate()
{
// 十字キーを押している間だけ移動
物体.velocity = 速度を入力 * オブジェクトの速度; //スクリプトが適用されているRigidbody2Dの速度。velocity=速度
}
}



お、日本語だとちょっとわかりやすいかも?

そうだろう?変数が全部日本語だと、慣れない内は楽だ。[moveInput * moveSpeed]よりも[速度を入力 * オブジェクトの速度]の方が直観的なのは日本人である以上仕方ない。けれど、これはあくまで処理の流れを理解しやすいように日本語に直してるだけだから、変数名やクラス名に日本語は使わないようにするんだよ。そして実はこのコードにはもう一つの大きなポイントがあるんだよね
新時代はAIが決め手

え、なによ……

これ実はAIに5秒で書いてもらったコードなんだよね。ChatGPTって有名でしょ?



なんですと……!?

自分がやったことは、「unity 2Dで、十字キーを押している間だけ動き続けるスクリプトを書いてください。」とAIにお願いしただけだよ。そしたら、さっきのコードと以下のアドバイスを貰えたよ。
このコードの挙動
-
十字キーを押している間だけ
velocity
に値が入り、キャラが動き続けます。 -
キーを離すと
(0,0)
になり、自然に止まります。 -
Rigidbody2D を持つので、Collider2D と衝突判定も効きます。
注意
-
Rigidbody2D の Body Type は「Dynamic」にしてください。
-
物理挙動を壊さないために、Transform.Translate や transform.position の直接操作は使わない方が安全です。
Rigidbody2D を使ったキャラ移動の基本
Update
と FixedUpdate
を分けて使うのがポイントです。
-
Update
→ 入力の取得(キー入力・マウス入力など) -
FixedUpdate
→ 物理演算に関わる処理(Rigidbody2D の移動や力の加算など)

私が思ってたよりAIって100倍賢いんだね……自分で勉強する意味あるのこれ?

AIが凄いからこそ、基本がもっとずっと大事になったと言い換えることもできるだろう?

まぁね……そういえばAIって沢山あるんでしょ?お金掛かるのは嫌なんだけど……

実質、無料で使えるのは[ChatGPT][Gemini]の2つになるね。だからこれから紹介していくのもこの2つになるよ。特にGeminiのほうは、APIというものを取得して、WEB以外からも使うことができるから、後の記事でやり方も紹介していくよ

ふーん……AIが答えてくれたコードで全てが完結するの?

AIが教えてくれたコードをそのままコピーしてUnityで実行してごらんよ

ふん。AIの力を思い知るが……あれ!?十字キーを押しても動かないし、コンソールにエラーが沢山出てる!?

基礎的なエラーが出ているね。エラー文をちゃんと見てなよ。エラーコードをそのままAIに張り付けても答えてはくれるけど、わかるかな?


えっと……CircleにRigidbody2Dがアタッチメントされていません……あっ、言われてみればコンポーネントから追加してないじゃない!それなのにスクリプトで 物体 = GetComponent<Rigidbody2D>(); でRigidbody2Dを探してる!

簡単な失敗だけど、わかったかな?AIが出来るのはスクリプトのコードのみで、Unity側の操作はユーザーがする必要があるんだ。今回で言えば、UnityのオブジェクトにRigidbody2Dをアタッチし忘れてたんだね

なるほどね。UnityのUIにも精通していかないとだ

では、オブジェクトのインスペクターからRigidbody2Dを追加しよっか。重力はいらないから0にしておこう。終わったら、再生ボタンを押そう


ぽちっとな♪

ちゃんと動いているね。もし、コードが難しくてわからないって場合は、AIに「もっとわかりやすく」とか「もっとかみ砕いて解説して」とか「小学生でもわかるように」教えて欲しいってお願いすればいいよ



コードをAIに書いてもらって解説もAIにお願いするってこと!?

それが令和7年の勉強法ってことだね。プログラムに限らず、上手くAIを使うのがとても大事な時代が既に到来してるってことを認識しておこう


はーい!
次のページ


※コメントポリシーはこちらから。