LoginSignup
1
1

More than 5 years have passed since last update.

unity入門 その3

Posted at

前回までのおさらい

  • unity上にオブジェクトを配置する
  • ユーザからの入力によりオブジェクトを操作
  • こんな画面まで完成 test.gif

前回最後に話していた、停止すると2度と動かなくなってしまう問題は、

Edit -> Project Setting -> Physicsで開くInspectorから

スクリーンショット 2016-02-06 8.29.08.png

Sleep Thresholdを0にすることで発生しなくなりました。
詳細は不明ですが、一定以下になるとスリープモードだかに入ってしまう
閾値らしくオブジェクトがスリープに入って動かなくなってたのか?

とりあえず、治ったから良いやというぐらいで、
先に進みます。

今日の目標

textからファイルを読み込んで、フィールド上に迷路をつくってみる。
以下参考にしたもの
 Unity スクリプトからステージを作成
 GameObjectの階層位置を変更

 事前準備1

自動生性させる1つ分の壁と、転がる球をPrefabs化する。
今回は、自動生成で周囲の壁も合わせて作成するので、前回作成した、壁は取り除きました。

スクリーンショット 2016-02-06 8.39.28.png

できたフォルダの名前を「Prefabs」に変更
スクリーンショット 2016-02-06 8.41.14.png

Prefabsの中に、球を入れてPrefab化します。

スクリーンショット 2016-02-06 8.42.09.png

同様に、壁になる為のObjectを作ります。
フィールドを生成した時と同じようにして、立方体を生成

さすがに、もう覚えてきました。
スクリーンショット 2016-02-06 8.45.17.png

Object名は[wall]としておきました。
球と同じように、Prefab化します。

壁を半透明にして、影のボールも見えるようにします。
壁用のMaterialを作成[wall]としました。
スクリーンショット 2016-02-06 9.20.10.png

今回は、適当に[Sprites/Diffuse]を選択
スクリーンショット 2016-02-06 9.20.54.png

カラーパレットで、一番下のAを調整することで、半透明にできます。

スクリーンショット 2016-02-06 9.21.05.png

Prefabsのwallを選択して、画像は、登録済みだったので半透明になってしまっています。
スクリーンショット 2016-02-06 9.22.18.png

materialを登録します。
スクリーンショット 2016-02-06 9.22.48.png

 ステージ読み込み用のスクリプト作成

ステージ読み込みには、C#を使いました。
*jsでもできますが、C#の方が楽そうなのでこっち使ってます。

いつものように、AssetsにC#スクリプトを生成、
ファイル名は、[creatStage]としてください。
スクリーンショット 2016-02-06 9.25.30.png

読み込み用ファイルを作ります。
[FileReadTest.txt]今回はこの名前で作成

FileReadTest.txt
#########################
#p# #                #  #
# #                  #  #
#   #  # # ######### # ##
#####  # #     #     # ## 
#      #       #       ## 
#      ######  #   #### # 
#      #       #        # 
#              #        # 
#              #        # 
#                       #                                                                          
#                       #                                                                          
#       #               #                                                                          
#                       #                                                                          
#                       #                                                                          
#    ######             #                                                                        
#        #    ####      #                                                                          
#        #    #  #      #                                                                          
#     #  #    #  #      #                                                                          
#        #    #  #      #                                                                          
#        #    #  #      #                                                                          
#      # ######  #  #   #                                                                          
#                       #                                                                          
#                       #                                                                          
######################### 

25×25のマップに「#」を壁、「p」が球を配置します。

creatStage.cs
using UnityEngine;
using System.Collections;
using System.IO; //System.IO.FileInfo, System.IO.StreamReader, System.IO.StreamWriter
using System; //Exception
using System.Text; //Encoding


public class creatStage : MonoBehaviour {
    private string guitxt = "";
    public TextAsset textAsset;

    //配置するオブジェクト
    public GameObject block;
    public GameObject player;
    public GameObject parents;

    public Vector3 createPos;
    public Vector3 spaceScale = new Vector3(1.0f,1.0f,1.0f);

    // Use this for initialization
    void Start () {
        createPos = parents.transform.position - parents.transform.lossyScale * 0.5f + block.transform.lossyScale * 0.5f;
        createPos.z = parents.transform.lossyScale.z * 0.5f - block.transform.lossyScale.z * 0.5f;
        CreateStage(createPos);
        createPos = Vector3.zero;
    }

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

    }

    void CreateStage(Vector3 pos){
        Vector3 originPos = pos;
        string stageTextData = textAsset.text;
        pos.y = 0;

        foreach(char c in stageTextData){

            GameObject obj = null;

            if(c == '#'){
                obj = Instantiate(block, pos, Quaternion.identity) as GameObject;
                obj.name = block.name;
                pos.x += obj.transform.lossyScale.x;

                obj.transform.parent = parents.transform;

            }else if(c == 'p'){
                obj = Instantiate(player, pos, Quaternion.identity) as GameObject;
                obj.name = player.name;
                pos.x += spaceScale.x;
            }else if(c == '\n'){
                pos.z -= spaceScale.z;
                pos.x = originPos.x;
                Debug.Log (spaceScale.z);
            }else if(c == ' '){
                pos.x += spaceScale.x;
            }
        }


    }

}

フィールド読み込み用のシェルをGameObjectに登録します。
空のobjectを作成

スクリーンショット 2016-02-06 9.30.22.png

スクリーンショット 2016-02-06 9.31.32.png

これで、スタート時にファイル読み込みが実行されます。
読み込みに必要な、以下を設定
- Text Asset -> FileReadTest.txt
- Block -> Prefabsのwall
- Player -> PrefabsのSphere
- Parents -> Hierarcheのfield

こんな感じになります。
スクリーンショット 2016-02-06 9.34.31.png

実行するとこんな感じになります。

test.gif

FileReadTestを変更すると、生成されるフィールドも変更されます。

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