20200125のUnityに関する記事は6件です。

命名規約について(駄文)

駄文と書いて、セーフティネットひいてます。

昔は10年程度しかプログラマーとかやっていましたが、命名規約は大事です。
とはいうものの、活躍する場所次第だと思いますので、
・金融機関の基幹系
・移動通信の基幹系
・予備校システム
とか言えば、あたりがつく方はいるかな。

unityでも命名規約は大事だと思っていて、子どもたちのオブジェクトの名前を見ていると頭が痛くなることも多々あります。
ただ、これは職業病であって、子供たちはあとから命名規約の大切さを知ればいいと思いますよ。
とはいうものの、

a;:kfa:mi;rewmi@pqv]:,p

みたいなプロジェクト名とか、周りの人ノーツッコミで放置されていると、それはなんだかちょっと違くないかい。

言の葉とかいいますが、名前あっての大切さというのはマインドでどうにでもなると思うので、一生ひとりで作品作って、過去作を顧みない以外は、命名規約というカタい言葉とも付き合っていってほしいです。


余談ですが、
Character Controller を扱うための変数が Character Controller になっているのを見ると、毎回脳内で「デュヘイン、デュヘイン」(※)しています。

※...吼え立てよ、我が憤怒(ラ・グロンドメント・デュ・ヘイン)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

色の作り方(マテリアル)

プロジェクトウィンドウの 作成 をクリックして、
マテリアル をクリックする
b1.png
下図のように、なにかが作られる
b2.png
作る色が決まっているのであれば、先に名前をつけるのもあり。
右クリックでメニューを出して、そこから 名前の変更 をクリックする。
b3.png b4.png
名前の付け方は人それぞれかもだけど、
red
blue
yellow
だと五十音順でごちゃごちゃで(自分は)気持ち悪いので、
color_red
color_blue
color_yellow
とかしています。(命名については別記事で!!)

マテリアルのインスペクタウィンドウの上部、白い四角をクリックする。
b5.png b6.png

下図のように、色を決める。
決まったら、左上の赤いボタンをクリックして、ウィンドウを閉じる。
b7.png → b8.png


オブジェクトへの色の反映の仕方。

やり方①
マテリアルを、オブジェクトに直接ドラッグアンドドロップをする。
b9.png

やり方②
マテリアルを、ヒエラルキーウィンドウのオブジェクトにドラッグアンドドロップをする。
bx.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

新規プロジェクトの作成

少なくとも、どんなにunityハジメマシテでも、新規プロジェクト作成は自分でできるようになろう。


unityHubを起動する
a1.png←これ
下図のような画面が表示される
a2.png
画面右上の 新規作成 をクリックする
a3.png
ウィンドウ上部のunityのバージョンが正しいこと。わからない人は近くの詳しい人に確認する。
保存先は確認しておく。同じ端末を他の子と使っている場合、ちゃんとした場所に保存されているか、自分でも確認をする。ここに書かれていることがわからない場合、近くの詳しい人に確認する。
a4.png
プロジェクト名は、自分の作品だとわかる名前にすること。
ふあのれせふあのせばのとじりせはちてい゛り とか
af,weq@[,qrwe:fac:/fill ~-25 ~ ~-25 ~25 ~10 ~25 air 0 replace lava; とか
デタラメに入力するような幼稚な名称は避けること。
あと日本語だめ、ぜったい。
domino0125とか、zuttomo11とか、日付とか連番など、自分で管理できるもの、あるいは周りの人のルールに従うこと。
a5.png
a6.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity3D/C#で簡単なリバーシ(オセロ)を作る!!~Part2~

はいどうも〜ミ◯クボーイです〜!!
あ〜ありがとうございます!!え〜今、AWSのアカウントをいただきましたけどもね〜。
こんなんなんぼあってもいいですからね〜。(突然の茶番)

はじめに

本記事は前回の「Unity3D/C#で簡単なリバーシ(オセロ)を作る!!~Part1~」 (https://qiita.com/t-o2mt/items/40e4bca24011dd88d8a7) の続きとなります。

前回は盤と石を作成し、ゲームスタート時に石を初期配置するところまで説明しました。
今回はタップして石を置く処理と、引っくり返す処理を説明します。

タップして石を置く

    private int x;
    private int z;//タップした座標
    private eStoneState turn = eStoneState.BLACK;//ターン。最初は黒

    void Update()
    {
        PutStone();

        for (int i = 0; i < squareZ; i++)
        {
            for (int j = 0; j < squareX; j++)
            {
                // 石の状態を確認
                stoneManagers[i, j].SetState(stoneState[i, j]);
            }
        }
    }
    //タップで石を置く処理
    public void PutStone(){
        if (Input.GetMouseButtonDown(0))
        {
            //マウスのポジションを取得してRayに代入
            Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);

            //マウスのポジションからRayを投げて何かに当たったらhitに入れる
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out RaycastHit hit, 100))
            {
                //x,zの値を取得
                x = (int)hit.collider.gameObject.transform.position.x;
                z = (int)hit.collider.gameObject.transform.position.z;

                if (0 <= x && x < squareX && 0 <= z && z < squareZ &&
                    stoneState[z, x] == eStoneState.EMPTY && Turn(false) > 0)
                {
                    stoneState[z, x] = turn;
                    Turn(true);
                    turn = ((turn == eStoneState.BLACK) ? eStoneState.WHITE : eStoneState.BLACK);
                }
            }
        }
    }

"StageManager"に上記のコードを追加します。
Raycastの関数で得た座標をhitに入れ、xとz分け、stoneState[z, x]がeStoneState.EMPTYならturnでWHITEかBLACKに変え、Part1で記述したSetState()で石を表示させます。
これで、タップしたマスに石を置くことができます。

石を引っくり返す

    class TurnableStone {
        public int turnZ;
        public int turnX;
        public TurnableStone(int z, int x)
        {
            turnZ = z;
            turnX = x;
        }
    }//ひっくり返すことができる駒の位置

    int[] TURN_CHECK_X = new int[] { -1, -1, 0, 1, 1, 1, 0, -1 };
    int[] TURN_CHECK_Z = new int[] { 0, 1, 1, 1, 0, -1, -1, -1 };//石の隣8方向

    //ひっくり返す石を取得する処理
        int Turn(bool isTurn)
    {
        // 相手の石の色
        eStoneState enemyColor = ((turn == eStoneState.BLACK) ? eStoneState.WHITE : eStoneState.BLACK);

        bool isTurnable = false;// ひっくり返すことができるかどうか
        List<TurnableStone> turnableStoneList = new List<TurnableStone>();//ひっくり返す石のリスト
        int count = 0;
        int turnCount = 0;

        int plusX = 0, plusZ = 0;
        for (int i = 0; i < TURN_CHECK_X.Length; i++)
        {
            int _x = x;
            int _z = z;

            plusX = TURN_CHECK_X[i];
            plusZ = TURN_CHECK_Z[i];
            isTurnable = false;
            turnableStoneList.Clear();
            while (true)
            {
                _x += plusX;
                _z += plusZ;
                if (!(0 <= _x && _x < squareX && 0 <= _z && _z < squareZ))
                {
                    break;
                }
                if (stoneState[_z, _x] == enemyColor)
                {
                    // ひっくり返す対象
                    turnableStoneList.Add(new TurnableStone(_z, _x));
                }
                else if (stoneState[_z, _x] == turn)
                {
                    // ひっくり返すことができる
                    isTurnable = true;
                    break;
                }
                else
                {
                    break;
                }
            }

            //ひっくり返す処理
            if (isTurnable)
            {
                count += turnableStoneList.Count;
                if (isTurn)
                {
                    for (int j = 0; j < turnableStoneList.Count; j++)
                    {
                        TurnableStone ts = turnableStoneList[j];
                        stoneState[ts.turnZ, ts.turnX] = turn;
                        turnCount++;
                    }
                }
            }
        }
        return count;
    }

"StageManager"に上記のコードを追加します。Turnはint型でreturnさせています。
TURN_CHECKで隣接する全方位の石を確認し、引っくり返すことができるものだけをturnableStoneListに格納していき、for文でturnを繰り返し行えば引っくり返しが行えます。

駆け足ですが、これでようやくオセロの超最低限の機能をつけ終わることができました!!8888888888

最後に

bc3930ec879f30243e4f692fa5679611.png

Part1,2で説明した機能に【ランダムに石を置く敵AI】【枚数チェック】【制限時間】【勝利判定】を加えたものが上の画像です。やっぱり2Dよりきれい!!人は3Dより2D派だけど、ゲームはやっぱり3Dに限るね〜。

これにしっかりした敵AIさえつけることができればできれば、老若男女が白熱して楽しむことができる国民的ボードゲームアプリの完成です!!

ご拝読いただき、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity初心者Tips]Prefabは要るか?GameObjectを動的に生成する

初心者向けの本などで学習していると、何かをSceneに配置するときにはPrefabをあらかじめ用意してからInstantiateを用いることが多いですが、それは要らないときもある、という話です。

コンストラクタから作るGameObject

GameObject型はコンストラクタが在り、それを実行することで動的に生成することが可能です。

GameObject hogeGameObject = new GameObject("Hoge");

参考:GameObject-GameObject - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/2017.4/ScriptReference/GameObject-ctor.html

新たにGameObjectをSceneに配置可能です。必要に応じてAddComponentすればほしい機能を持ったGameObjectも簡単にメモリ上に展開できます。

無駄を減らせる?注意してみよう

  • これを利用することで予めPrefabで用意しInstantiateが要らなくなる
  • 無駄に常駐させるGameObjectを減らせる可能性がある

こうした利点があるので、「これは一時的に存在すれば済む」というものには積極的に利用する検討をしてみましょう。頻繁に生成や削除をする場合は、コストがかさむのでお勧めしません、適宜、パフォーマンスをどうしたらよくなるか、考えながら作りましょう。

Sceneに在るGameObjectをコピーする方法

prefabを用いない方法には他に、Scene内のGameObjectを参照してInstantiateで複製するという方法もあります。

GameObject origin = GameObject.Find("Hoge"); //元になるHogeを探す
GameObject hogeGameObject = new GameObject(origin); //Hogeを複製

この場合は予めSceneに存在しないと出来ないので、何か在るものを増やしたいときには有効です。あまり頻繁にやると、newと同じくらいのコストがかさむので注意は必要です。

Prefabが要るかの使い分け

Prefabを用いた場合、以下の特徴があります。

  • ファイルが分れるので別の人に作業分担してもらいマージしやすい
  • AddComponentで追加がたくさんある場合コストが下がる
  • エディタでコンポーネントの操作をするのでゲームデザイナーにもいじるのが優しい
  • Scene内の何かの参照は持てないので動的にやりくりする仕組みは必要(GameObjectのコンストラクタを用いた後の処理と似たものが要る)

こうしたことを踏まえて、考えていきましょう。データの分け方にはSceneで分ける方法もあるので、チームでどうしたいのか、更新するとしたらどのAssetの単位でやったらいいのか、なども考えると良いですね。

参照などの話はこちらも参考になります。
【Unity】動的に増やすGameObjectは別にPrefabでなくとも良い
http://tsubakit1.hateblo.jp/entry/2018/03/01/005236

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity初心者Tips]Prefabなしもアリ!GameObjectを動的に生成する

初心者向けの本などで学習していると、何かをSceneに配置するときにはPrefabをあらかじめ用意してからInstantiateを用いることが多いですが、それは要らないときもある、という話です。

コンストラクタから作るGameObject

GameObject型はコンストラクタが在り、それを実行することで動的に生成することが可能です。

GameObject hogeGameObject = new GameObject("Hoge");

参考:GameObject-GameObject - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/2017.4/ScriptReference/GameObject-ctor.html

新たにGameObjectをSceneに配置可能です。必要に応じてAddComponentすればほしい機能を持ったGameObjectも簡単にメモリ上に展開できます。

無駄を減らせる?注意してみよう

  • これを利用することで予めPrefabで用意しInstantiateが要らなくなる
  • 無駄に常駐させるGameObjectを減らせる可能性がある

こうした利点があるので、「これは一時的に存在すれば済む」というものには積極的に利用する検討をしてみましょう。頻繁に生成や削除をする場合は、コストがかさむのでお勧めしません、適宜、パフォーマンスをどうしたらよくなるか、考えながら作りましょう。

Sceneに在るGameObjectをコピーする方法

prefabを用いない方法には他に、Scene内のGameObjectを参照してInstantiateで複製するという方法もあります。

GameObject origin = GameObject.Find("Hoge"); //元になるHogeを探す
GameObject hogeGameObject = new GameObject(origin); //Hogeを複製

この場合は予めSceneに存在しないと出来ないので、何か在るものを増やしたいときには有効です。あまり頻繁にやると、newと同じくらいのコストがかさむので注意は必要です。

Prefabが要るかの使い分け

Prefabを用いた場合、以下の特徴があります。

  • ファイルが分れるので別の人に作業分担してもらいマージしやすい
  • AddComponentで追加がたくさんある場合コストが下がる
  • エディタでコンポーネントの操作をするのでゲームデザイナーにもいじるのが優しい
  • Scene内の何かの参照は持てないので動的にやりくりする仕組みは必要(GameObjectのコンストラクタを用いた後の処理と似たものが要る)

こうしたことを踏まえて、考えていきましょう。データの分け方にはSceneで分ける方法もあるので、チームでどうしたいのか、更新するとしたらどのAssetの単位でやったらいいのか、なども考えると良いですね。

参照などの話はこちらも参考になります。
【Unity】動的に増やすGameObjectは別にPrefabでなくとも良い
http://tsubakit1.hateblo.jp/entry/2018/03/01/005236

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む