Roll-a-ball の制作(9) カメラ位置を調整する

Unity公式サイトのチュートリアルに沿って、
Roll a ballというサンプルゲームを制作する8回目です。

learn.unity.com


前回は、Playerオブジェクトの移動速度を変更しました。

game-seisaku.hatenablog.com


今回はカメラ位置の調整を行います。

 

■ カメラ位置を調整する

インスペクタより、Main CameraのTransformの値を以下のように変更します。

f:id:Yamakawa-Yoshi:20200817004635j:plain

カメラプレビューにあるように、上から見下ろす位置にカメラが調整されました。

続いてMain Cameraのインスペクタより、コンポーネントを追加 → CameraControllerという名前で新しくスクリプトを追加します。作成したCameraControllerのスクリプトは、Scriptsフォルダ以下に移動します。

f:id:Yamakawa-Yoshi:20200817010141p:plain

f:id:Yamakawa-Yoshi:20200817010210p:plain

CameraControllerのスクリプトを開いて以下のように修正します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{

    public GameObject player;
    private Vector3 offset;

    // Start is called before the first frame update
    void Start()
    {
        offset = transform.position - player.transform.position;
        
    }

    // Update is called once per frame
    void LateUpdate()
    {
        transform.position = player.transform.position + offset;
    }
}

修正したらコードを保存し、インスペクタに戻ります。

Camera Controller(スクリプト)のPlayerのところをクリックし、

Playerオブジェクトを選択します。

f:id:Yamakawa-Yoshi:20200817011428p:plain

再生すると、Playerオブジェクトの動きに合わせてカメラも追随するようになりました。

f:id:Yamakawa-Yoshi:20200817011927g:plain

今回はここまでにします。

次回は、プレイエリアを作っていきます。

 

 

 

 

 

 

Roll-a-ball の制作(8) Playerオブジェクトの動作を変更する

Unity公式サイトのチュートリアルに沿って、
Roll a ballというサンプルゲームを制作する8回目です。

learn.unity.com


前回は、Playerオブジェクトが動作するようC#のコードを修正しました。
今回はPlayerオブジェクトの動作を変更していきます。

game-seisaku.hatenablog.com

今回はC#でPlayerオブジェクトの動作を記述していきます。

 

■ Playerオブジェクトの移動速度を変更する

前回までのPlayerControllerのコードを以下のように修正します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    public float speed = 0.0f;

    private Rigidbody rb;
    private float movementX;
    private float movementY;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>(); 
    }


    void OnMove(InputValue movementValue)
    {
        Vector2 movementVector = movementValue.Get<Vector2>();
        
        movementX = movementVector.x;
        movementY = movementVector.y;
        
    }
    
    private void FixedUpdate()
    {
        Vector3 movement = new Vector3(movementX, 0.0f, movementY);
        rb.AddForce(movement * speed);

    }

}

変数 speed をpublic で 宣言すると、

Unityエディタ上のインスペクタに、speedというプロパティが現れるのでここに

例えば10と値を入れてみます。

 

再生してみると、おぉ!Σ(・□・;)確かに入力した値分Playerの移動速度が速くなっていますね。

f:id:Yamakawa-Yoshi:20200817003102g:plain

今回はここまでにします。

次回はカメラ位置の設定を行います。

 

 

 

 

 

 

 

 

Roll-a-ball の制作(7) C#でPlayerオブジェクトの動作を記述する

Unity公式サイトのチュートリアルに沿って、

Roll a ballというサンプルゲームを制作する7回目です。

前回は、Unityエディタでスクリプトを編集するための準備として、

C#開発環境Visual Studioのインストールおよび、UnityエディタとVisual Studioの連携を行いました。

今回はC#でPlayerオブジェクトの動作を記述していきます。

 

PlayerControllerについて

最初に前回作成したPlayerControllerを開いてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 スクリプトを起動したときに一度だけ実行されるのがStart() メソッド、
フレームごとに呼び出されるのがUpdate() メソッド

です。

次に、このソースコード以下のように修正します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    private Rigidbody rb;
    private float movementX;
    private float movementY;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>(); 
    }

    void OnMove(InputValue movementValue)
    {
        Vector2 movementVector = movementValue.Get<Vector2>();
        
        movementX = movementVector.x;
        movementY = movementVector.y;

    }

    private void FixedUpdate()
    {
        Vector3 movement = new Vector3(movementX, 0.0f, movementY);

        rb.AddForce(movement);
    }

}

上記のソースコードについて簡単に説明します。

最初にStrat()メソッドでは、

rd = GetComponent<RigidBody>();

としています。

これによって、以降変数rbを通じてRigidBodyのコンポーネントにアクセスできるようになります。

さて、Unityには、
何かアクションを起こしたときに呼び出されるイベントトリガーという機能があります。

OnMoveはこのUnityのイベントトリガーで呼び出される関数の1つで、Moveイベントが発生したとき、つまりオブジェクトが動いたときに呼び出される関数です。

OnMove()関数では、入力された値をmovementXとmovementYの変数にそれぞれ格納します。

 

デフォルトで用意されているUpdate()とFIxedUpdate()の違いは、

前者がフレームごとに呼び出されるのに対して、後者は一定時間ごとに呼び出されるというところです。

FixedUpdate()の中で、

rd.AddForce(movement);

としていますが、これはRigidbody に力を加える処理です。

このことによって、Playerオブジェクトは入力された値で動くようになります。

  

実際にPlayerオブジェクトを動かしてみる

実際にPlayerオブジェクトを動かしてみます。

Unityエディタの▶のボタンを押して再生モードにします。

f:id:Yamakawa-Yoshi:20200816232716j:plain

キーボードの矢印キーでPlayerが動いたでしょうか?

(注!)動かなかった人は、Input Systemでキーボードが通知されていない可能性があります。プロジェクト設定のInput System Packageでデバイスを追加しておくとキーボードがきくようになるかもです。

f:id:Yamakawa-Yoshi:20200816232801p:plain

 

今回はここまでにします。

次回はPlayerオブジェクトの移動スピードを変更していきます。

 

#Unity #ゲーム制作

 

 

 

 

 

 

 

 

 

Roll-a-ball の制作(6) C#開発環境の準備とUnityエディタの連携

Unity公式サイトのチュートリアルに沿って、

Roll a ball というサンプルゲームを制作する6回目です。 

 

 

前回は、Input Systemを設定して、Playerオブジェクトを操作できる準備を行いました。

今回は、Unityエディタでスクリプトを編集するための準備として、

C#開発環境のVisual Studioのインストールおよび、

VisualstudioとUnityエディタの連携を行います。

 

 

スクリプトを格納するフォルダを用意する

 

最初に、スクリプトを格納するフォルダを用意します。

 

プロジェクトウインドゥで右クリック

 ↓

作成 → フォルダー → Scripts という名前でフォルダを作成 

f:id:Yamakawa-Yoshi:20200813173038j:plain

 

 C#スクリプトを記述する

 

Unityのスクリプトは、C#というプログラミング言語で記述します。

C#の文法や記述方法については、このチュートリアルの記事の範囲外ですので説明しません。

 

私もC#を書くのは初めてです。一緒に勉強しながら進めましょう。

ちなみに、私は以前 「独習C# 新版」 というC#の参考書をKindleで購入しっぱなしになっていたので、この機会に並行してC#も勉強していきます。

f:id:Yamakawa-Yoshi:20200813173041j:plain


 

それではUnityエディタでC#スクリプトを用意します。

 

今回はPlayerオブジェクトの動作を、C#スクリプトで記述するので、

対象となるPlayerオブジェクトを選択

 ↓

インスペクターの「コンポーネントを追加」 → 新しいスクリプト 

 ↓

スクリプトの名前を PlayerController に変更

 ↓

作成して追加します。 f:id:Yamakawa-Yoshi:20200813173044j:plain

 

コンポーネントとして追加した直後のスクリプトは、Assetsフォルダの直下にあるので、
これを、Scriptsフォルダに移動しておきます。

 

f:id:Yamakawa-Yoshi:20200813173047j:plain

Unityでは、上記のようにして、
操作対象のゲームオブジェクトにスクリプトを設定します。
 
 

Visual Studio のインストール

 

ここから、C#のコードを記述していきますが、その前にC#プログラミング開発環境を用意します。

マイクロソフトのサイトから、Visual Studio をダウンロードしてインストールします。

f:id:Yamakawa-Yoshi:20200813173433j:plain


 

Visual Studio とUnityを連携させる

 

インストールしたVisual Studioは、Unityエディタと連携させる必要があります。

Visual Studioから、個別のコンポーネントとして、Unityによるゲーム開発 を追加でインストールします。

f:id:Yamakawa-Yoshi:20200813173435j:plain

Unityエディタに戻って、メニューバーより

環境設定 → 外部ツール → Visual Studio 2019 を選択します。

f:id:Yamakawa-Yoshi:20200813173438j:plain

以上で、C#プログラミング開発環境のVisualstudioのインストールと

Unityエディタとの連携ができました。

 

Unityエディタで用意したC#スクリプト PlayerController をクリックしてみましょう。

Opening Visual Studio と表示され、

Visual Studio 上で、PlayerControllerのC#スクリプトを編集できるようになります。

f:id:Yamakawa-Yoshi:20200813173441j:plain

Visual Studio の操作方法もこのチュートリアルでは説明しないので、

参考書や関連サイトを参考願います。

 

今回はここまでです。

 
次回は、Playerオブジェクトの動作をC#で記述していきます。
 

Roll-a-ball の制作(5) PlayerにInput Systemを設定する

Unity公式サイトのチュートリアルに沿って、

Roll a ball というサンプルゲームを制作する5回目です。

 

前回は、Unityの物理演算の機能であるRigidBodyの設定をしました。

 

今回は、入力を受け付けられるようにInputSystemを設定します。

 

Input Systemのインストール

最初にPlayerをキーボードで操作できるように、Input Systemを設定します。
この時点ではUnityには、Input Systemの機能はインストールされていないので、
新しくUnityエディタ上でインストールします。

メニューバーの「ウィンドウ」 → Package Manager を選択

f:id:Yamakawa-Yoshi:20200816205235j:plain

Package Managerのポッポアップウインドウが出るので、
「すべてのパッケージ」が選択されている状態で、下にスクロール
 ↓
Input Systemを選択して Installします。

f:id:Yamakawa-Yoshi:20200816205239p:plain

これで、UnityエディタにInput Systemのパッケージが追加されます。

※Input Sytemのパッケージをインストール中に、以下のような注意が出て着ることがあります。
新しいInput Systemを有効にするためYesを選択しておきます。
 → Yesを選択するとUnityエディタが再起動されます。

 

f:id:Yamakawa-Yoshi:20200816205242j:plain

 

Input Systemを有効にする

インストールしたInput Systemを有効にします。

メニューバーの「ビルド設定」
アーキテクチャより  → x86 を x86_x64 に変更

f:id:Yamakawa-Yoshi:20200816205245p:plain


Unityエディタが再起動します。

Player Input のコンポーネントを追加します。

前回のRigidbodyの追加の時と同様に、
インスペクターからコンポーネントを追加 → Player Inputと入力して選択
インスペクタにPlayer Inputのプロパティが追加されます。

f:id:Yamakawa-Yoshi:20200816205250j:plain

Input Actionを定義する

次にPlayerオブジェクトに、入力がされたときの動作を定義する必要があるのですが、
Input Systemにはデフォルトでテンプレートが用意されているのでこれを利用します。

インスペクターのPlayer Inputプロパティより Create Actionを選択
 ↓
エクスプローラーウインドウが現れるので → Inputという名前でフォルダを作成
 ↓
作成したInputフォルダの下に、InputActionsという名前で保存します。

 

f:id:Yamakawa-Yoshi:20200816205253p:plain


今回はここまでです。

次回は、作成した inputactionsにスクリプトでPlayerオブジェクトの動作を記述していきます。

#Unity#Unityチュートリアル#物理演算#Rigidbody

Roll-a-ball の制作(4) Playerに物理演算の振る舞いを設定する

Unity公式サイトのチュートリアルに沿って、
Roll a ball というサンプルゲームを制作する4回目です。

前回は、プレイヤーオブジェクトの作成と、マテリアルの設定について説明しました。

今回は、Rigidbodyについて解説します。

RigidBodyについて?

rigidbodyは何かというと、

物理演算を扱うためにUnityが用意している機能のことです。
Unityではrigidbodyを使うことで、非常に簡単に物理演算を行えます。

要は、Rigidbodyの機能を使うことで、
■ビリヤード
エアホッケー
■跳ねることができる地面
■球技スポーツ
といった、物理演算を使うシンプルなゲームを簡単に作れるようになるということです。

>>Rigidbody を使うと、ゲームオブジェクトを物理特性によって制御する事ができるようになります。
>>リジッドボディがフォースやトルクを受けると、オブジェクトはより現実的な動きをします。
>>重力をうけたり、スクリプトを使ってフォースを与えたり、
>>NVIDIA PhysX 物理エンジンを通して他のオブジェクトの影響を受けるようにするためには、
>>ゲームオブジェクトに Rigidbody を追加する必要があります。

Unityの公式サイトを見ると、上記のようにRigidbodyについて解説されています。
とはいえ、この説明はちょっとわかりづらい感じがするので、
私なりに説明してみますね。

今回の Roll a ball のゲームでは、プレイヤーである球体が、回収するオブジェクトに接触したり、壁にぶつかったりするときに、その当たり判定として物理演算の機能を必要とします。

f:id:Yamakawa-Yoshi:20200816204542j:plain


で、この物理演算を一から実装するとムチャクチャ大変です。
ということで、一から作ると非常に大変な物理演算を、UnityではRigidbodyという機能で提供しているというわけです。

ではさっそくUnity上でRigidbodyを使ってみましょう。

Playerオブジェクトを選択
 ↓
インスペクターの「コンポーネントを追加」
 ↓
テキストフィールドにRigidbodyと入力 → リジットボディと出るので選択

f:id:Yamakawa-Yoshi:20200816204545j:plain

上記の手順を行うと、インスペクターのところに、
Rigbodyに関するプロパティが追加されます。

これで、以降Playerオブジェクトに物理演算の振る舞いを持たせることが可能になります。

次回は、物理演算ができるようになったPlayerオブジェクトを実際に操作できるようにしていきます。

 

 

 

 

 

Roll-a-ball の制作(3) プレイヤーオブジェクトの作成~マテリアルの設定

Unity公式サイトのチュートリアルに沿って、
Roll a ball というサンプルゲームを制作する3回目です。


前回は、Unityエディタのビューに慣れるところまでをやりました。
今回は、プレイヤーオブジェクトの作成と、マテリアルの設定について説明します。

 

Playerオブジェクトの作成

Unityエディタは前回の続きからです。

最初にヒエラルキービューのところで、
前回、3DオブジェクトでPlaneを作ったのと同様に、
今回はSphere(球体)を選択します。

 f:id:Yamakawa-Yoshi:20200816202103p:plain

そうすると、このようにシーンビューに球体が出現します。
続けて、この球体を選択した状態で、インスペクターのところで、
オブジェクト名がSphereになっているので、
Sphere → Player に変更します。
下のTransformより、右の・が縦に3つ並んでいるところをクリックして、
Resetを選択します。 

f:id:Yamakawa-Yoshi:20200816202107j:plain

すると、
ヒエラルキービューに表示されていた名前も、
Sphere → Playerに変更されました。
また、このPlayerオブジェクトの座標位置も原点の 0,0,0 にリセットされました。

 

f:id:Yamakawa-Yoshi:20200816202111p:plain


さて、今のところ球体のPlayerオブジェクトは、平面Groundにちょうど半分だけめり込んでいます。
Playerを上方向に移動しましょう。
垂直上方向を向いている緑色がありますが、これはY軸を表します。
(赤い点線で囲ったところ)
このY軸の矢印にマウスカーソルを合わせて、上方向にドラッグしてください。

 

f:id:Yamakawa-Yoshi:20200816202115p:plain


Playerの球体が垂直上方向に移動しました。
PositionのY座標が、最初の0から、上に移動した分変化しているのが分かると思います。

PositionのYの値を0.5に変更します。 f:id:Yamakawa-Yoshi:20200816202119j:plain


Playerがちょうど地面Groundの上に接する位置に移動しました。
UnityのScaleの単位は、デフォルトでは1が1メートルらしいです。
今PlayerのScaleを見ると、X,Y,Zいずれも1なので、
Playerは直径1メートルの球体ということが分かります。

先ほどまではPlayerが原点にあったので、直径の半分のところで地面にめりこんでしまっていましたが、
上方向(Y軸のプラス方向)に0.5つまり半径の長さの分だけ移動したので、
移動後は、ちょうど地面に接する位置になったというわけです。

 

Lighting(照明)の調整

ゲームシーンのLighting(照明)について見ていきます。
ヒエラルキービューのDirection Lightを選択します。
インスペクターのLightタブより、Colorの色をクリックして、
Direction Lightのカラー選択ポップアップを出します。

f:id:Yamakawa-Yoshi:20200816202121p:plain

カラーピッカーのところでカーソルをドラッグしながら色をいじっていくと、色に応じて、Direction Lightで照らされたPlayerやGroundの色合いが変わっていくのが分かります。

f:id:Yamakawa-Yoshi:20200816202125j:plain

それではRGBそれぞれの値に255を設定します。
これでDirection Lightの色は、白になります。

 

f:id:Yamakawa-Yoshi:20200816202128p:plain

 

マテリアルでオブジェクトの色を変更する

Unityのゲームオブジェクトは、オブジェクト表面の色や質感の情報を管理しているマテリアルというプロパティがあります。
このマテリアルを変更することで、ゲームオブジェクトのカラーを任意に変更できます。 


最初にプロジェクトビューのAssetsの下に、
新しく Materials という名前でフォルダーを作ります。

f:id:Yamakawa-Yoshi:20200816202131p:plain

新しく作ったMaterialsフォルダーを選択した状態で、
右クリック → Create → Material を選択します。

 

f:id:Yamakawa-Yoshi:20200816202135j:plain


Assets > Materials の下に、
New Material という名前で新規にマテリアルが作られます。

このマテリアルの名前を、
New Material → Background に変更します。

f:id:Yamakawa-Yoshi:20200816202140p:plain


Backgroundマテリアルを選択した状態で、インスペクターを確認します。


Backgroundマテリアルのインスペクターより、
Surface Inputs セクション
Base Map の色選択のところをクリックして、カラーピッカーを表示させます。

f:id:Yamakawa-Yoshi:20200816202144j:plain


カラーピッカーのRGBのところに、それぞれ130の値を設定します。
また、Surface InputセクションのSmoothnessの値を0.25に変更します。

 

f:id:Yamakawa-Yoshi:20200816202148j:plain


ここまでで設定したBackgroundマテリアルをドラッグし、
シーンビューのGroundオブジェクトにドラッグアンドドロップして持っていきます。
(操作が失敗したら、Ctrl + Z で直前の操作に戻せます)

f:id:Yamakawa-Yoshi:20200816202151j:plain

これにより、設定したBackgroundマテリアルが、

Groundオブジェクトに適用されます。


同様に、次はPlayerオブジェクトに割り当てるマテリアルを作成します。
Materialsフォルダの下に、新しいマテリアルを作成し、マテリアルの名前をPlayerに変更します。

f:id:Yamakawa-Yoshi:20200816202154j:plain

Playerマテリアルを選択した状態でインスペクターを確認します。
Base Mapより、カラーピッカーのRGBのところに、
それぞれ0,220,225の値を設定します。

また、Surface Inputセクションの
Smoothnessの値を0.75に変更します。

 

f:id:Yamakawa-Yoshi:20200816202157j:plain


設定したPlayerマテリアルをドラッグし、
シーンビューのPlayerオブジェクトにドラッグアンドドロップして持っていきます。

f:id:Yamakawa-Yoshi:20200816202201j:plain


Direction Lightの角度を調整します。
ヒエラルキービューからDirection Lightを選択し、
インスペクターのTransformセクションより、
Rotationの値を、
X:50,Y:50,Z:0
にそれぞれ変更します。

f:id:Yamakawa-Yoshi:20200816202204p:plain


以上、今回は
プレイヤーオブジェクトの作成、およびマテリアルを設定して、
オブジェクトに適用するところまでを説明しました。

次回はいよいよ、Roll a Ballのゲーム機能部分の作成に入ります。

#UNITY#ゲーム制作