芋出し画像

【Unity 初心者向け】オブゞェクトの移動② | キヌ入力で自由にオブゞェクトを動かす方法

前回は、transform.position の倀を倉曎するずオブゞェクトが移動するこずを確認したした。

たずえば、次のように曞くず、オブゞェクトは右方向ぞ動き続けたす。

transform.position += Vector3.right * speed * Time.deltaTime;

ただし、このたたではゲヌムを開始した瞬間から勝手に動いおしたいたす。
ゲヌムでは、

  • 右キヌを抌したら右ぞ移動する

  • 巊キヌを抌したら巊ぞ移動する

  • 䞊キヌを抌したら䞊ぞ移動する

  • 䞋キヌを抌したら䞋ぞ移動する

ずいうように、プレむダヌの入力に応じお移動する方向を倉えるこずがよくありたす。

今回は、キヌ入力を䜿っおオブゞェクトを䞊䞋巊右に動かしおみたしょう。
埌半では、4方向の凊理をたずめお、より扱いやすい移動方法に発展させたす。


1今回䜜るもの

今回は、キヌボヌドの矢印キヌを䜿っおオブゞェクトを䞊䞋巊右に移動させたす。

最初は、

Input.GetKey()

を䜿っお、キヌが抌されおいるかを1぀ず぀確認したす。
さらに

Input.GetAxisRaw()

を䜿っお「どの方向ぞ移動したいのか」を数倀ずしお取埗する方法を確認したす。

最終的には、次のようなコヌドになりたす。

float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");

Vector3 direction = new Vector3(x, y, 0).normalized;

transform.position += direction * speed * Time.deltaTime;

少し難しそうに芋えたすが、順番に確認すれば、それぞれが䜕をしおいるのか分かるようになりたす。


2キヌ入力移動のプログラム

2-1右キヌを抌したずきだけ移動する

たずは簡単なずころから始めたしょう。

前回䜜成したスクリプトを䜿っお、右矢印キヌを抌しおいる間だけ右ぞ移動するようにしたす。

using UnityEngine;

public class ObjectMove : MonoBehaviour
{
    public float speed = 3f;

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += Vector3.right * speed * Time.deltaTime;
        }
    }
}

ゲヌムを実行しお、キヌボヌドの右矢印キヌを抌しおみたしょう。
キヌを抌しおいる間だけ、オブゞェクトが右ぞ移動したす。


2-2Input.GetKeyずは

今回登堎したのが、以䞋のコヌド

Input.GetKey()

Input.GetKey()は、指定したキヌが珟圚抌されおいるか、を調べる呜什です。
今回は、

Input.GetKey(KeyCode.RightArrow)

ずしおいたす。

KeyCode.RightArrowは、キヌボヌドの右矢印キヌを衚しおいたす。
右矢印キヌが抌されおいれば true、抌されおいなければ false になりたす。
そのため、

if (Input.GetKey(KeyCode.RightArrow))

では、右矢印キヌが抌されおいるずきだけ if の䞭の凊理を実行する、ずいう意味になりたす。

Input.GetKey()で重芁なのは、キヌを抌しおいる間、䜕床もtrueになる、ずいう点です。
Update()はゲヌム䞭、繰り返し実行されおいたす。
そのため、

if (Input.GetKey(KeyCode.RightArrow))
{
    transform.position += Vector3.right * speed * Time.deltaTime;
}

ずするず、右キヌを抌しおいる間、

少し右ぞ移動
↓
少し右ぞ移動
↓
少し右ぞ移動
↓
少し右ぞ移動

ずいう凊理が繰り返されたす。
結果ずしお、オブゞェクトが滑らかに右ぞ動きたす。


2-3Vector3.rightずは

前回は、

new Vector3(1, 0, 0)

のように、X・Y・Zを指定しお移動方向を䜜りたした。

Unityには、よく䜿う方向が最初から甚意されおいたす。

今回登堎した

Vector3.right

は右方向を衚すコヌドで、

new Vector3(1, 0, 0)

ず同じ方向を衚したす。
X成分がプラスの倀なので、右方向になりたす。


2-4その他の方向も甚意されおいる

Unityには、右方向だけでなく、ほかの方向も甚意されおいたす。

右方向は䞊で確認した通り

Vector3.right

new Vector3(1, 0, 0)

巊方向は

Vector3.left

new Vector3(-1, 0, 0)

UnityEditorのバヌゞョンによっおは、Vector3.left が䜿えない堎合がありたす。
その時は以䞋のように指定したす。

-Vector3.right


䞊方向は

Vector3.up

new Vector3(0, 1, 0)

䞋方向は

Vector3.down

new Vector3(0, 1, 0)

前方向は

Vector3.forward

new Vector3(0, 0, 1)

埌方向は

Vector3.back

new Vector3(0, 0, -1)

このように、よく䜿う方向はVector3にあらかじめ甚意されおいたす。


2-5巊右に動かしおみる

それでは、巊矢印キヌも远加しおみたしょう。

void Update()
{
    if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.position += Vector3.right * speed * Time.deltaTime;
    }

    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.position += Vector3.left * speed * Time.deltaTime;
    }
}

これで、

  • 右矢印キヌ → 右ぞ移動

  • 巊矢印キヌ → 巊ぞ移動

ずなりたす。


2-6䞊䞋の移動も远加する

さらに、䞊ず䞋も远加したす。

void Update()
{
    if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.position += Vector3.right * speed * Time.deltaTime;
    }

    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.position += Vector3.left * speed * Time.deltaTime;
    }

    if (Input.GetKey(KeyCode.UpArrow))
    {
        transform.position += Vector3.up * speed * Time.deltaTime;
    }

    if (Input.GetKey(KeyCode.DownArrow))
    {
        transform.position += Vector3.down * speed * Time.deltaTime;
    }
}

これで矢印キヌを䜿っお、オブゞェクトを䞊䞋巊右ぞ自由に動かせるようになりたした。

珟圚の凊理を日本語で考えるず、次のようになりたす。

右キヌが抌されおいたら
    右ぞ移動

巊キヌが抌されおいたら
    巊ぞ移動

䞊キヌが抌されおいたら
    䞊ぞ移動

䞋キヌが抌されおいたら
    䞋ぞ移動

非垞に分かりやすい曞き方です。
キヌ入力の仕組みを勉匷するずきは、たずこの方法で動きを確認するず理解しやすいでしょう。

ただし、少し気になるずころもありたす。
方向が増えるたびに、

if (...)
{
    transform.position += ...
}

ずいう凊理を远加しなければなりたせん。
そこで次は、入力された方向を最初にたずめお䜜る方法 ã‚’考えおみたしょう。


3移動方向の数倀化

3-1「どちらぞ動きたいか」を数倀で取埗

巊右の入力を、数倀で衚しおみたす。
右ぞ移動したい堎合は、

X = 1

巊ぞ移動したい堎合は、

X = -1

どちらも抌しおいない堎合は、

X = 0

ず考えるこずができたす。

同じように䞊䞋も、

侊 → Y = 1
例 → Y = -1
入力なし → Y = 0

ず考えられたす。

぀たり、プレむダヌの入力から、

X方向の倀
Y方向の倀

を取埗できれば、

new Vector3(x, y, 0)

ずしお移動方向を䜜るこずができたす。

ここで䜿えるのが、

Input.GetAxisRaw()

です。
ゲット・アクシス・ロり ず読みたす。


3-2Input.GetAxisRaw("Horizontal")

たず、次のコヌドを曞いおみたしょう。

float x = Input.GetAxisRaw("Horizontal");

Horizontalは、暪方向の入力を取埗するために䜿いたす。
基本的には、

右 →  1
å·Š → -1
入力なし → 0

ずいう倀を取埗できたす。
そのため、

float x = Input.GetAxisRaw("Horizontal");

ずするず、暪方向ぞの入力を x ずいう倉数に保存できたす。


3-3Input.GetAxisRaw("Vertical")

䞊䞋方向は、

float y = Input.GetAxisRaw("Vertical");

で取埗できたす。

基本的には、

侊 →  1
例 → -1
入力なし → 0

ずなりたす。

これで、

float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");

ずするこずで、暪方向ず瞊方向の入力をそれぞれ取埗できたす。

補足
Input.GetAxis()ずいう䌌た呜什もありたす。
GetAxisRaw()は入力倀がすぐに-1・0・1ぞ切り替わりたすが、GetAxis()は倀が埐々に倉化したす。
今回は移動方向を分かりやすく確認するため、GetAxisRaw()を䜿甚したす。


3-4入力からVector3を䜜る

取埗した x ず y を䜿っお、移動方向を䜜りたす。

Vector3 direction = new Vector3(x, y, 0);

たずえば右キヌを抌しおいる堎合、

x = 1
y = 0

なので、

new Vector3(1, 0, 0)

になりたす。
これは右方向です。

䞊キヌを抌しおいれば、

x = 0
y = 1

なので、

new Vector3(0, 1, 0)

になりたす。
これは䞊方向です。


この方法の䟿利なずころは、2぀のキヌを同時に抌した堎合です。

たずえば、右キヌず䞊キヌを同時に抌すず、

x = 1
y = 1

ずなりたす。
そのため、

new Vector3(1, 1, 0)

ずいう方向ができたす。
これは右䞊方向です。

同じように、2぀のキヌを同時に抌したずきは次のようになりたす。

å·Š  侊 → (-1, 1, 0)

右  例 → (1, -1, 0)

å·Š  例 → (-1, -1, 0)

぀たり、入力倀からVector3を䜜るだけで、斜め方向も自然に扱うこずができたす。


4数倀化した倀を䜿った移動

4-1䜜った方向ぞ移動する

数倀化した方向を、前回ず同じようにtransform.positionぞ远加したす。

float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");

Vector3 direction = new Vector3(x, y, 0);

transform.position += direction * speed * Time.deltaTime;

これだけで、䞊䞋巊右ず斜め方向ぞ移動できたす。
かなりコヌドがすっきりしたした。


4-2斜め移動の問題

ここで実際に動かしおみるず、1぀問題がありたす。
右だけを抌した堎合は、

new Vector3(1, 0, 0)

ずころが、右ず䞊を同時に抌すず、以䞋のようになりたす。

new Vector3(1, 1, 0)

この2぀は、方向だけでなく ãƒ™ã‚¯ãƒˆãƒ«ã®é•·ã• ã‚‚違いたす。
(1, 1, 0) のほうが長いため、そのたた移動に䜿うず、斜めに移動したずきのほうが速くなっおしたいたす。


4-3normalizedで方向の長さをそろえる

そこで䜿うのが、.normalized です。

次のようにしたす。

Vector3 direction = new Vector3(x, y, 0).normalized;

normalizedを䜿うず、方向はそのたたでVector3の長さを1にそろえる こずができたす。

たずえば、

new Vector3(1, 0, 0)

は長さ1です。
䞀方、

new Vector3(1, 1, 0)

は、そのたたでは長さが1より倧きくなりたす。
.normalized を䜿うこずで、斜め方向も é•·ã• 1 にそろえるこずができたす。

その結果、䞊䞋巊右でも斜めでも、ほが同じ速床で移動できるようになりたす。


5完成コヌド

今回の最終的なコヌドはこちらです。

using UnityEngine;

public class ObjectMove : MonoBehaviour
{
    public float speed = 3f;

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");

        Vector3 direction = new Vector3(x, y, 0).normalized;

        transform.position += direction * speed * Time.deltaTime;
    }
}

最初に䜜った4぀の if ず比べるず、かなり短くなりたした。


5-1コヌドを順番に読んでみる

今回のコヌドで特に重芁なのは、凊理を3段階に分けお考えるこずです。
たず、

float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");

で、プレむダヌがどのキヌを抌しおいるかを数倀ずしお取埗したす。

次に、

Vector3 direction = new Vector3(x, y, 0).normalized;

で、取埗した入力から移動する方向を䜜りたす。

最埌に、

transform.position += direction * speed * Time.deltaTime; 

で、䜜った方向ぞ実際にオブゞェクトを移動したす。

぀たり、

キヌ入力
↓
移動方向を䜜る
↓
その方向ぞ移動する

ずいう流れになっおいたす。

この考え方は、これからプレむダヌを操䜜するスクリプトを䜜るずきにずおも重芁になりたす。


5-2GetKeyを䜿う方法ずの違い

最初に䜜ったコヌドでは、

if (Input.GetKey(KeyCode.RightArrow))
{
    transform.position += Vector3.right * speed * Time.deltaTime;
}

のように、キヌごずに移動凊理を曞いおいたした。

䞀方、GetAxisRawを䜿った方法では、

float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");

Vector3 direction = new Vector3(x, y, 0).normalized;

ずしお、最初に移動方向を1぀䜜っおいたす。

そしお最埌に、

transform.position += direction * speed * Time.deltaTime;

ず、移動凊理を1回だけ行っおいたす。

Unityにただ慣れないうちは、たずGetKeyを䜿っお「キヌが抌されおいたら、その方向ぞ動かす」ずいう仕組みを理解するこずが倧切です。

そこから「入力から移動方向を䜜る」ずいう考え方ぞ発展させるず、コヌドの意味を理解しやすくなりたす。


21今回のたずめ

今回は、キヌボヌドの入力を䜿っおオブゞェクトを自由に動かす方法を確認したした。

次回は、transform.positionぞ盎接座暙を远加する方法ずは少し違う、Transform.Translate を䜿った別の移動方法に぀いお確認しおいきたす。


こちらはUnity初心者向けの蚘事をテヌマ別にたずめおいたす。
â–Œ Unity初心者向け蚘事たずめはこちら


こちらのマガゞン「ミニゲヌム䜜成講座 党8回セット」でもシヌンの切り替えなどを掻甚しお、初心者でも知識れロから䜜れるミニゲヌム䜜成講座を玹介しおいたす。

さらにステップアップの「スマホで遊ぶゞャンプゲヌム 8回セット」のマガゞンもぜひご掻甚ください。


ファむブボックスでは、スクラッチやUnityの個別指導のオンラむンレッスンを行っおいたす。
ご興味のある方は圓サむト、オンラむンレッスンから、無料䜓隓授業ぞお問い合わせ䞋さい。

いいなず思ったら応揎しよう

ファむブボックス よろしければ応揎お願いしたす いただいたチップはクリ゚むタヌずしおの掻動費に䜿わせおいただきたす