LoginSignup
1
1

More than 5 years have passed since last update.

昔の懐かしいやつをちょっと真似してみた

Posted at

昔好きだったゲームをちょっと真似して作って行ってみよう。

知ってる人は知っていると思います。
Quintyというゲーム
quinty wikipedia

unityで勉強がてら真似してみようと思います。

クインティを3D化しよう!

今回の目標

quinty.gif

  • playerを作る
  • 3Dで作る。
  • playerの位置に応じて床をクルクル回す。

壁フィールドを生成する。

3D ObjectのCubeを駆使して力技で配置しただけです。

ただ、床のマスを配置するときのObject名は、
縦何個目、横何個目なのかがわかるようにしておきました。

スクリーンショット 2016-07-13 22.13.16.png

101の場合は、縦1、横1
301の場合は、縦3、横1

プレイヤーを作る

かなり手抜きですが、精一杯作ってます

スクリーンショット 2016-07-13 22.15.22.png

playerを作る時は、一番上のレベルにplayerという空のobjectを作成し、
その下に追加するようにしておきます。
⇩こんなイメージ
スクリーンショット 2016-07-13 22.16.16.png

そうすることで、playerに対して、回転処理などを行った場合
全部のオブジェクトがいい感じに追従して回ってくれます。

playerにつけるスクリプト

移動スクリプト
walkSpeedなんかは適当に設定しておいてください。
前半は、[.]を押した時に、現在位置と向きから
めくる対象となるオブジェクト位置の計算を行い、
対象オブジェクトに床の回転指示を与える処理です。

後半は、方向に応じて、向きを変えて、その方向に等速で進む処理です。

playerControl.js

function Update () {

    // パネルめくり
    if (Input.GetKeyUp(".")) {
        // 向きに応じて、めくりパネルを選択
        if( transform.localRotation == Quaternion.Euler(0, 180, 0)){
            // 縦方向は 四捨五入で整数 1桁目
            // 横方向は 少数以下切り捨て で対象オブジェクトになる。 3桁目
            var x = Mathf.RoundToInt(transform.localPosition.x);
            var z = Mathf.FloorToInt(transform.localPosition.z);
            var dic = "Left";
        }
        else if( transform.localRotation == Quaternion.Euler(0, 90, 0)){
            z = Mathf.RoundToInt(transform.localPosition.z);
            x = Mathf.FloorToInt(transform.localPosition.x)+1;
            dic = "Down";
        }
        else if( transform.localRotation == Quaternion.Euler(0, 270, 0)){
            z = Mathf.RoundToInt(transform.localPosition.z);
            x = Mathf.FloorToInt(transform.localPosition.x);
            dic = "Up";
        }
        else if( transform.localRotation == Quaternion.Euler(0, 0, 0)){
            // 右向きの場合
            // 縦方向は 四捨五入で整数 1桁目
            // 横方向は 少数以下切り捨て+1 で対象オブジェクトになる。 3桁目
            x = Mathf.RoundToInt(transform.localPosition.x);
            z = Mathf.FloorToInt(transform.localPosition.z)+1;
            dic = "Right";

        }
        var objeName = x + "0" + z;

        var obj:GameObject = GameObject.Find("Field/"+objeName);
        if(obj){
          // 各オブジェクトにsendMessage
          obj.SendMessage(dic);
        }
    }
       // 方向転換 移動
    else if (Input.GetKey(KeyCode.LeftArrow)) {
        transform.localPosition.z = transform.localPosition.z - walkSpeed;
        transform.localRotation = Quaternion.Euler(0, 180, 0);
    }
       else if (Input.GetKey(KeyCode.DownArrow)) {
        transform.localPosition.x = transform.localPosition.x + walkSpeed;
        transform.localRotation = Quaternion.Euler(0, 90, 0);
    }
    else if (Input.GetKey(KeyCode.UpArrow)) {
        transform.localPosition.x = transform.localPosition.x - walkSpeed;
        transform.localRotation = Quaternion.Euler(0, 270, 0);
    }
    else if (Input.GetKey(KeyCode.RightArrow)) {
        transform.localPosition.z = transform.localPosition.z + walkSpeed;
        transform.localRotation = Quaternion.Euler(0, 0, 0);
    }

}

 床オブジェクトのスクリプト

Updateの中で、回転メッセージを受信した時にだけ、
一定速度でcubeを回転させます。
if( transform.rotation == toRot )の処理で、
対象cubeの回転が完了した時の処理を行います。

今回は、回転角度のオーバーフローが心配だったので、
回転が終了したら、回転角度を0に戻しておきました。

後半のfunctionはplayerControlから受信する
メッセージの受け取り口です。

cubeControl.js


function Update () {
    if(LeftOn){
        var toRot : Quaternion = Quaternion.Euler(-90, 0, 0);
        transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
        if( transform.rotation  == toRot ){
            LeftOn = false;
            transform.localRotation = Quaternion.Euler(0, 0, 0);
        }
    }
    if(DownOn){
        toRot = Quaternion.Euler(0, 0, -90);
        transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
        if( transform.rotation  == toRot ){
            DownOn = false;
            transform.localRotation = Quaternion.Euler(0, 0, 0);
        }
    }
    if(UpOn){
        toRot = Quaternion.Euler(0, 0, 90);
        transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
        if( transform.rotation  == toRot ){
            UpOn = false;
            transform.localRotation = Quaternion.Euler(0, 0, 0);
        }
    }
    if(RightOn){
        toRot = Quaternion.Euler(90, 0, 0);
        transform.rotation = Quaternion.Slerp (transform.rotation, toRot,  Time.deltaTime * 10.0);
        if( transform.rotation  == toRot ){
            RightOn = false;
            transform.localRotation = Quaternion.Euler(0, 0, 0);
        }
    }

}

function Left(){
    Debug.Log("Left");
    if(!DownOn && !UpOn && !RightOn){
        LeftOn = true;
    }
}

function Down(){
    Debug.Log("Down");
    if(!LeftOn && !UpOn && !RightOn){
        DownOn = true;
    }
}

function Up(){
    Debug.Log("Up");
    if(!LeftOn && !DownOn && !RightOn){
        UpOn = true;
    }
}

function Right(){
    Debug.Log("Right");
    if(!LeftOn && !DownOn && !UpOn){
        RightOn = true;
    }
}

今日はここまで。

予定

  • 敵オブジェクト配置
  • 敵オブジェクトをplayerを追いかけるようにする。
  • 床回転時に飛んでくようにする
  • 壁にぶつかったら消滅
  • playerと敵の当たり判定
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1