Unityでゲーム作成-エアホッケー-

unity
スポンサーリンク
ラグ対策インターネット回線

なにやらunityで簡単にゲームが作れると聞いたので、実際に作ってみました。これから2記事に分けて、完成までを記載していきます。

完成するゲーム↓

スクリプトをイジる必要がありますが、0から独学初心者でも一応なんとかゲームらしきものを作ることができました!

C#?なにそれ?のレベルからでも1週間ぐらいでつくることができましたので、unityすごい!

オブジェクトとスクリプトなどはこんな感じ。

ステージを作る

Hierarchyのcreateから壁(Cube)4つ、床(Plane)、ボール(Sphere)、プレイヤー(Cylinder)などを設置。

Inspector内の数値をいじって、ステージを作る。

このように設定すればステージは完成。

色の付け方

ProjectのCreateからmaterialを選択。初期設定は白になっているので、スポイトみたいなアイコン横の色をクリックして変える。これを色を変えたいオブジェクト(CubeとかPlane)にドラッグすると色が変えられる

物理的な法則をつける

ボール(Sphere) にRigidbodyをつける。Hierarchyで操作するオブジェクトをクリック後、Inspector内のAdd ComponentからRigidbodyを選択するとアタッチできる。

こんな感じで設定する。

ボールには最初からSphere Colliderが付いているが、今回はCapsule Colliderを別にアタッチして使用する。当たり判定を安定させるため…。Sphere Colliderは無効にして良い。Colliderによって当たり判定を検知している。

こんな感じに。Sphere Colliderだと、点と面が当たるので、挙動が安定しない時があったので… (playerをtransformで移動させるからなんだけど) 。あと、このボールは床からほんのり浮かしておいた方が良い。

後からplayerの動ける範囲を設定するのだが、この設定と接触して、ボールが変な挙動&接触時の効果音がなってしまったので。

ボールの跳ね返りを設定する

ProjectのCreateからPhysic Materialを選択。

こんな感じに設定する。名前はなんでも良い。

これを、さっき作成したCapsule Colliderに入れます。

ボールのCapsule ColliderのMaterialのとこに。これでボールがはね返るようになります。

playerとなるCylinderを操作できるようにする

キー入力でCylinderを移動できるようにする。

ProjectのCreateからC# Scriptを選ぶ。名前をcontroller1にする。それをダブルクリックするとスクリプトを記述するためのソフトが起動されるはず。下記コードをコピペする。

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

public class controller1 : MonoBehaviour
{
    public float speed = 6.0f;
    private Vector3 pos;
    bool start;
    private void Start()
    {
        start = false;
    }

    // Update is called once per frame
    //Playerの移動処理
    void Update()
    {
        if (Input.GetKey("w"))
        {
            transform.position += transform.forward * speed * Time.deltaTime;
        }
        if (Input.GetKey("s"))
        {
            transform.position -= transform.forward * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.Space))
        {
            start = true;
        }
        if (start)
        {
            if (Input.GetKey("d"))
            {
                transform.position += transform.right * speed * Time.deltaTime;
            }
            if (Input.GetKey("a"))
            {
                transform.position -= transform.right * speed * Time.deltaTime;
            }
            if (Input.GetKey(KeyCode.LeftShift))
            {
                if (Input.GetKey("w"))
                {
                    transform.position += transform.forward * 9f * Time.deltaTime;
                }
                if (Input.GetKey("s"))
                {
                    transform.position -= transform.forward * 9f * Time.deltaTime;
                }
                if (Input.GetKey("d"))
                {
                    transform.position += transform.right * 9f * Time.deltaTime;
                }
                if (Input.GetKey("a"))
                {
                    transform.position -= transform.right * 9f * Time.deltaTime;
                }
            }
        }
        Clamp();
        // ★追加
        // プレーヤーの移動できる範囲を制限する命令ブロック
        void Clamp()
        {
            // プレーヤーの位置情報を「pos」という箱の中に入れる。
            pos = transform.position;

            pos.x = Mathf.Clamp(pos.x, -9.5f, -0.6f);
            pos.z = Mathf.Clamp(pos.z, -4, 4);

            transform.position = pos;
        }
    }
}

出来上がったスクリプトを自分が操作するCylinderオブジェクトにドラッグする。 これで再生してみると動く。

スペースキーを押したらスタートするようにしてあるので、スペースキーを押した後、キーボードの”w””s””a””d”で、上下左右に動かすことが出来るはず。
※ステージを作成したポジションによって、playerの移動制限範囲を変えなければならない。スクリプト内の最後あたりのpos.xとpos.zの数字を作成したステージ内で収まるように調整する必要がある。

次に、相手となるplayerのためのcontroller2スクリプトを作る。

新たに生成したスクリプトに下記コードをコピペ。

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

public class controller2 : MonoBehaviour
{
    public float speed = 6.0f;
    private Vector3 pos;
    bool start;

    private void Start()
    {
        start = false;
    }

    // Update is called once per frame
    //Playerの移動処理
    void Update()
    {
        if (Input.GetKey("up"))
        {
            transform.position += transform.forward * speed * Time.deltaTime;
        }
        if (Input.GetKey("down"))
        {
            transform.position -= transform.forward * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.Space))
        {
            start = true;
        }
        if (start)
        {
            if (Input.GetKey("right"))
            {
                transform.position += transform.right * speed * Time.deltaTime;
            }
            if (Input.GetKey("left"))
            {
                transform.position -= transform.right * speed * Time.deltaTime;
            }
            if (Input.GetKey(KeyCode.RightShift))
            {
                if (Input.GetKey("up"))
                {
                    transform.position += transform.forward * 9f * Time.deltaTime;
                }
                if (Input.GetKey("down"))
                {
                    transform.position -= transform.forward * 9f * Time.deltaTime;
                }
                if (Input.GetKey("right"))
                {
                    transform.position += transform.right * 9f * Time.deltaTime;
                }
                if (Input.GetKey("left"))
                {
                    transform.position -= transform.right * 9f * Time.deltaTime;
                }
            }
        }
        Clamp();
    }

    // ★追加
    // プレーヤーの移動できる範囲を制限する命令ブロック
    void Clamp()
    {
        // プレーヤーの位置情報を「pos」という箱の中に入れる。
        pos = transform.position;

        pos.x = Mathf.Clamp(pos.x, 0.6f, 9.5f);
        pos.z = Mathf.Clamp(pos.z, -4, 4);

        transform.position = pos;
    }
}

これをplayer2となるCylinderにドラッグする。

これで矢印キーでも動くようになるはずだ。

ちなみに、動くスピードを変えたいなら、Inspector内のSpeedの数値を変えればplayerの速さが変更できる。

ボールを始動させてゲームっぽく

ボールに下記コードスクリプトを追加する。

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

public class ballstart : MonoBehaviour
{
    public float speed = 6;
    private Vector3 pos;
    bool One;
    // Use this for initialization
    void Start()
    {
        One = true;
    }
    // Update is called once per frame
    void Update()
    {
        if (One)
        {
            if (Input.GetKey("w"))
            {
                transform.position += transform.forward * speed * Time.deltaTime;
            }
            if (Input.GetKey("s"))
            {
                transform.position -= transform.forward * speed * Time.deltaTime;
            }
            if (Input.GetKey(KeyCode.Space))
            {
                var force = (transform.forward + transform.right) * 3.5f;
                GetComponent<Rigidbody>().AddForce(force, ForceMode.VelocityChange);
                One = false;
            }
            Clamp();
        }

        // ★追加
        // プレーヤーの移動できる範囲を制限する命令ブロック
        void Clamp()
        {
            // プレーヤーの位置情報を「pos」という箱の中に入れる。
            pos = transform.position;

            pos.z = Mathf.Clamp(pos.z, -4, 4);

            transform.position = pos;
        }
    }
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            Rigidbody rigidbody = GetComponent<Rigidbody>();
            rigidbody.velocity = rigidbody.velocity * 1.13f;
        }
    }
}

これでスペースキーを押したらボールが動き出すようになる。

player1、player2のCylinderオブジェクトのTagをPlayerにすれば、playerに当たればスピードupしていく仕様になっている。

とりあえず今回はここまでにします。

続きは次回に。。
エアホッケー作成続き https://h2blo.com/unity/hockey2

お疲れさまでした!

PC限定で完成したゲームが遊べます↓

PR
スポンサーリンク
安くて高性能おすすめゲーミングモニター
unity
ぽんたをフォローする

コメント

タイトルとURLをコピーしました