化学出身者がUnityを1年間勉強してみる

Unityを中心とした独学記録

いらいら棒のゲーム2回目

前回に引き続き、いらいら棒(ボール転がしゲーム)のゲームの作成をしてみた、というか完成した。

 

百聞は一見にしかず、完成版のURLを貼り付けておく。

unityroom.com

前回の要素に加え、扉が開かない場合(今回はcoinが足りない場合)はテキストを返すようにした。なんてことはなくテキストをGameObjectとしてpublic化し、if文を用いてcoinが規定数以下の場合テキスト表示することにした。

ただ、本当は扉に触れる度にテキストを表示したいが、if文でSetActive(true)を返した後、一定時間経過後経過する方法が分からなかったため再表示のスクリプトがかけなかった。(Time.Deltatimeがよくわかってない)

 

初のゲームを作成した感想。

良かった点

・わからないことも検索すれば何かしらヒットする。

・望んだ通りには作れないが、似たようなものは作れる。

1つ目は初心者がつまずくポイントは似ているのか検索かければ何かした解決策が見つかったこと。例えば数学の微分なら問題文によって整数、分数、三角関数(後何か)とパターンがある。加えて文章問題なら問題によって微妙に解法が異なることもあるので問題文を検索しても答えがそのままヒットしない。力学で言えば梁の問題でも片持ちや両端固定、Y字型等々種々の問題がある。さらに検索しても類似問題がでてきても途中の解法が載っていないこともある。

その点Unityなら質問内容とスクリプトは殆どセットで聞くことが多いのでどうやったか分からない、ということが少なかった。もちろん本当にわからないものもあるが、その場合最悪コピペしてしまえば問題なかったりする(前回2つ目の一定運動は正直理解できていないが機能している)

2つ目は100%重い通りにはならないが、問題ないものは作れるということ。扉接触時のテキストがそれに当たる。

 

改善点

・オブジェクト配置が手間

・カメラ操作、リトライボタンが実装できなかった

1つ目はオブジェクトの配置が思い通りに行かなかった。具体的にはシーンビューでオブジェクトを持ったままカメラ移動できない、オブジェクトの角に吸い付く方法はわかったが、中央にできない、ということ。前者は検索したら解決法が乗っていた気がするので参照してみる。

2つ目のカメラ操作は元々考えておらず、またよくあることなので検索すれば解決する見込みはある。リトライボタンは動画内で説明していたことだが、何故かできなかった。ただ、今回の重要度は低く時間を割かなかったため改めてみると解決する可能性はある。

 

感じたこと

・動画を見てメモしたことは殆ど見なかった。

・表現がサイトによってまちまち、重複するところがある

1つ目は勉強法に関することで、動画で学んだことをメモ帳に書いていたものの、メモ帳だとコードが見にくく、結果再度動画見たほうが早かったこと。

2つ目は当たり前ではあるが同じことをしようと思ってもサイトによって使用するや、ヴァージョン、設定違いによって表示画面が異なっていた。加えて少し古いサイトだとJavaScriptを使用していたりするので互換性の問題もあった。

 

今後の展開

・もう一つの動画を勉強しようと思っていたが、C#の基礎を勉強するためテキストを購入したのでそちらで基礎を固める。テキストに関しては次回更新時に紹介する。

・ゲーム面に関しては、今回のcoinをHPに、あとカメラアングルのやり方がわかれば体力=攻撃力の簡単なシームレスアクションRPG(ロールプレイングはしないが数値を使う戦闘=RPGという風潮があるのでこのように呼称する)が作成可能と思われる。今回頓挫したリトライボタンみたいなボタンを使えるようになると

いらいら棒のゲーム1回目

Unityちゃん講座も殆どが終わりゲームの骨格を作成する場面になったためいらいら棒(ボール転がりゲーム)のステージつくりをやってみた。

今回ゲーム中に登場させるオブジェクトは次の通り。

・静止状態のオブジェクト配置

・一定運動するオブジェクト配置

接触することで消えるオブジェクト配置

接触することで落下するオブジェクト配置

接触するとアイテム化するオブジェクト配置

・特定状態で作動するオブジェクト配置

1つ目はcubeからオブジェクトを作成して配置するだけなので容易。

2つ目はRigidbodyで可能ではあるが他にtransform.positionというのを定義する必要があった。ここら辺の定義や変数を引っ張るのは正直いまいち分かってないので復習する必要がありそう。また、サンプルゲームでの回転床はどうやらアニメーションで行っており、よく分からないのでパス。

3つ目はOnCollisionEnterを使い、if関数を用いてプレイヤータグのオブジェクトが触れればx秒後に消えるという風にしたら解決。以下メモ代わりのコード。

public class Opendoor : MonoBehaviour
{

    // オブジェクトに接触したらボールを削除する処理
    void OnCollisionEnter(Collision other)
    {
        // 接触するオブジェクトのタグが"Player"であれば
        if (other.gameObject.CompareTag("Player"))
        {
                // オブジェクトを1秒後に削除する
                Destroy(gameObject, 3.0f);
        }
    }
}

4つ目は3つ目のDestoryをVector3型に変えれば可能だと思う。今回は消滅だけで事足りたのでパス。
3,4つ目に言えることだが、接触、なのでプレイヤーとy軸に差があった場合、横から触れても時間のカウントが始まる。今回は3Dだが高さの概念は入れないので問題ないが、空間を用いたギミックを用意する場合この方法では無理になるかもしれない。
5つ目は講義中でもやったが、OnTriggerEnterを使えば可能。Unity上でIs Triggerにチェックを入れる必要がある。OnCollisionEnterとの違いはTrigger型なら物理演算は行わないので接触検知のみで可能、つまりプレイヤーの保持していた運動を妨げないというところで、主に触れれば消えるものに使える。また、消えるのは非アクティブ可させているので、SetActive(false)となる。

private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Coin"))
        {
            other.gameObject.SetActive(false);//非アクティブ化
            count = count + 1;//カウントを+1
            SetCountText();//countの値をCountTextに置き換える?

6つ目は5つ目のcountの値が一定値以上だとそのオブジェクトが消えるというもの。一番苦戦したものである。
最初に行ったのは3つ目のif関数にcountを入れたもの。確かにオブジェクトは消えたものの、そのcountはそのオブジェクト内のみのcount。一方、私が行いたいのは5のcount値を用いたもの。

public class Door : MonoBehaviour
{
    public int count;
    void OnCollisionEnter(Collision col)
    {
        // 接触するオブジェクトのタグが"Floor"であれば
        if (count >= 1)
        {

            // オブジェクトを1秒後に削除する
            Destroy(gameObject, 1.0f);
        }
    }
}

このDoor型オブジェクトのcountはこのスクリプト上のみでの呼称になるため、他スクリプトでいくらcountが変化しても関係ないというもの。試しpublic型なのでcount =5としてやれば問題なく消えた。
解決策として、本来行いたいcountが行われているスクリプト(本ゲームでは全てPlayerオブジェクトのスクリプト)上で作用させることで上手くいった。なので、5のスクリプトの続きに次のように書いた。

 void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.CompareTag("Door"))

        {
            if (count >= 1)
            {
                other.gameObject.SetActive(false);
            }
        }
    }

これで、countが1以上ならDorオブジェクトは消えることになる。

折角if文を使っているのだから、countが1未満ならエラーメッセージを返すようにしてみようかな。メッセージを表示すること自体は簡単だが、一定時間後に消えるにはどうすればいいのだろうか。まあこれは余力があればする。


とりあえず15時間ほどゲーム制作に時間を使う予定だったが、ここまでで5時間ほど経過している。実現したい挙動は概ね達成できたので残りはオブジェクトを配置していく。
あとは落下時ゲームを再度読み込むスクリプトが必要だが、ゴールオブジェクトと同じくこれは講義の内容そのままなので最悪コピペでも問題ない。

Unityちゃん 13-15

4日目はUnityちゃんの動画8-まで視聴。内容は以下の通り。()内数字は講義のレクチャー番号。

・物理演算を使わないプログラムで、1フレームごとに作動させる方法とこれまでの復習(13)

・オブジェクトの非接触と非アクティブ化(14)

・UIの表示(15)

13回では、前にパソコンの性能によってフレーム数が変わるので、フレームの絶対的な値を指示してどのパソコンでもフレーム数が同一になるようにした(FixedUpdate())。今回は物理演算を伴わない場合Time.deltaTimeを用いることで同様の操作を可能とした。

14回ではUnityではデフォルトの状態において、オブジェクト同士が接触すると反発するが、それを通過する方法(Is Trigger)と通過することで非アクティブ化にし、取得したように見せる方法を学んだ。

15回では14回で行った取得したオブジェクトを内部でカウントし、それをユーザーが見られるようにした。13回、14回の内容を踏まえると、アイテムを取得しそれがスコア等に加算されるような動きが可能となった。

 

一通りの講座は終了し、ステージのガワは作ることが出来る。

現在の知識を用いると下記ギミックが実現可能と思われる。

.静止状態のオブジェクト配置

.一定運動するオブジェクト配置

接触することで消えるオブジェクト配置

接触することで落下するオブジェクト配置

1,3は講義そのままで可能、2は応用になるものの、サンプルワールドにそのギミックがあるためコードを見れば可能だと思われる。

4は3の応用でColliderとRigidbodyを使えば可能か?現時点では

1、落下する足場とプレイヤーが触れることで足場が落下

2、落下する足場の上に透明なオブジェクトを配置し、プレイヤーが触れると足場が落下

が考えられる。特に2は透明なオブジェクトと足場を親子関係にしてやれば出来るだろうか。違いとして透明なオブジェクトサイズ<足場とすることで

1、足場の端を上手いこと移動すれば落ちる足場が作動することなく移動可能

2、特定箇所に触れると足場全体が移動

要は時差を用いたギミックが作れそうだということ。

 

ここまではこれまでの内容を踏まえれば実現可能だが、一つ新しいことを学んでみたい。それは「特定オブジェクトを所持していれば特定の扉が動く」つまりゲームによく見る鍵のこと。

Unityチュートリアルの3?にあった扉のソースがヒントになるかもしれない。

これらを用いていらいら棒みたいなゲームの作成を目指す。

 

少し触れて問題点が見えてきたが長くなるので次回以降とする。

Unityちゃん 8-12

3日目はUnityちゃんの動画8-まで視聴。内容は以下の通り。()内数字は講義のレクチャー番号。

・Unityでスクリプトを作成する方法(8)

・プレイヤーを動かす(9)

・修正方法(10)

・カメラをプレイヤーに追従させる(11)

・オブジェクトを配置する(12)

Unityでの言語はC#を用いる。ただUnity上では編集できないのでコードエディタ(Visual Studio)を使用して編集する。

{}内を1つのブロックとして一番大きなブロックがクラス、Unityでは1つのスクリプトで1つのクラスしか使わないのでスクリプト=クラスの認識で問題なしのはず。

 

プログラムを使うためには変数を入れておく箱が必要。クラスの次の行に『変数の型(キャラクターを動かすならRigidbodyで可)』スクリプト上での名称(任意のものでよい)を宣言。 

あとは矢印キーで動く変数と適当な変数(今回はmove)を宣言してUnity上で動く方法(public変数)を学んだ。

 

カメラはデフォルトでは一点からの見下ろしだが、プレイヤーに追従させることでTPS操作が可能となる。その際、スクリプトの優先順位(カメラが先に動くかプレイヤーが先に動くか)を設定可能。

また、オブジェクトの配置方法も学んだ。プロジェクトウインドウではフォルダが作成可能だが、ヒエラルキーでは不可能→ダミーのヒエラルキーを作成しそこにドロップすることで配置可能(親子関係の方法を利用)

 

 

なんていうか、本当にメモ書き見たいになってしまった。

今回はプログラム関係が多かったから説明しにくいというのもあるかもしれない。加えてやっていることはわかるが使いこなせるような所には至ってないので(当たり前だが)ただコピーしているだけ、というのもあるかもしれない。

Unityちゃん 5-7

2日目はUnityちゃんの動画5-7まで視聴。内容は以下の通り。()内数字は講義のレクチャー番号。

・オブジェクトを目的地まで移動、オブジェクトの位置、サイズ変更、コピー(5)

・オブジェクトの位置を変更、リセット(6)

・オブジェクトを設置、色変更、テクスチャ貼り付け(7)

 

インスペクタは次の2つを習得

 NavMesh Agent(ナビメッシュエージェント)目標値まで最適な動きで動く(4)
 Transformコンポーネント オブジェクトの位置、サイズを決定(必ずついている)(5)

その他名称

 Prefab(プレハブ)シーン内オブジェクトをプロジェクトウィンドウに保管、コピーして使うもの
  アイコンは青色立方体、シーンビューorヒエラルキーにドラッグして使用。

Assetsフォルダ Unityプロジェクトウィンドウの中身(ゲームない部品を全て格納、Sceneフォルダの保存先等)

Gizmo(ギズモ) シーンビュー上ツールバーで切り替えて使用(6)

 

続いてはUnity上での操作

f:id:hayato208:20190112152457p:plain

オブジェクトのリセット方法

 

f:id:hayato208:20190112152410p:plain

オブジェクトの設置方法

 

f:id:hayato208:20190112152708p:plain

オブジェクトに色を付加

f:id:hayato208:20190112152858p:plain

テクスチャの貼り付け方法

名称とか画像で分かるようにしないとあとから見返したとき分からないかもしれない。あと、Excelにまとめた操作とか貼り付けているけど、今度からやめようかな、最後のとかテキストボックスの文字表示されていないですし。

次からはプログラミングをやるらしい。私は未経験なのでここからが辛そう。現時点でも動画時間30分弱に対し、勉強時間が80分なのでこのペースでいくと全動画終わるのに4,5時間ほどかかりそう。

Unityちゃん 1-4

初日はUnityちゃんの動画1-4まで視聴。内容は以下の通り。()内数字は講義のレクチャー番号。

・Unityについて(1)

・Unityのインストール方法(2)

・画面サイズ、視点変更、各種ウインドウの説明(3)

・オブジェクトに重力を追加する。オブジェクトに触れる。(4)

 

習得したインスペクタは次の通り
 Rigidbody(リジッドボディ) オブジェクトに重力や判定を付属させる(5)

 

インストールとか一部現在のバージョンと違うところもあったものの、いつもの癖で他オブジェクトをインストールしないがために少し困ったことに。

どうやら『Unity Hub』を使えば出来るらしくインストールしたもののしっかり出来ているか不安。

あと、保存先もFドライブにしたためにちゃんと変更できているか不安。パーティションを変更してFドライブの要領をCドライブに移したほうがいいかもしれない。

 

Unity上の操作は次のことを勉強。

 ヒエラルキー オブジェクト一覧
 アセット ゲーム内オブジェクトの呼称
 シーンビュー ゲーム制作をする画面
 ゲームビュー 実際のゲーム画面
 インスペクタ ゲームオブジェクトの詳細


 Alt+左 回り込み
 ホイール押しながら 平行移動
 オブジェクトをシーンビューの中心に捕らえる ヒエラルキーをダブルクリック

もう少し分かりやすくしないとダメかもね。

 

 

各種教材

初めて記事を書いてみましたが、懸念材料でしたブログ内検索は標準装備のようですね。更に、投稿日時の変更も可能のようです。特に変更する予定はありませんが自己紹介や教材の紹介等単発で立てるようなものは見易さ重視で適当な日時に投稿するのもいいかもしれませんね。

加えて、「編集オプション」→「カスタムURL」からURLの末尾を自由に変更できるようです。基本的には投稿時間でしょうが概要(Unityやexcel)+通し番号でURL入力で記事に飛ぶ、ということが可能です。最も、カテゴリーをしっかりしていれば関係ないですし、第一目的の記事まで飛ぶように別途管理するのは手間でしょうが……。

ここでは各種教材を羅列していこうと思います。あくまでメモ変わりみたいなものですね。

・Unity

『ユニティちゃんが教える!初心者向けUnity講座』

https://www.udemy.com/unity-chan-tutorial-01/

Udemyでの日本語唯一無料講座です。目下3Dゲームは作る予定はないですが(目標はデッキ構築型ボードゲームを作成すること)わざわざ視野を狭める必要はないので、まずはこちらで勉強していこうと思います。

みたところ、ボールを転がしていくいらいら棒系のゲーム作成が最終目標みたいです。

 

『アクションゲームをまるごと作って体験できる!Unityゲーム制作ハンズオン』

https://www.udemy.com/unity-ry/

ハンズオン形式で2D型横スクロールゲーム(ランゲー)を作成していく講座です。

 

どちらもランダム性のなさそうなゲームなのでランダム性を持たせるのは難しいのかな。分かりませんけど。

ひとまずはこの2つを終了させることを目標に頑張って見ます。時間は160分と420分、合計で580分(=10時間)程度になっています。

 

『ドットインストール』

https://dotinstall.com

Unityもプログラミングツールですので、それらを学ぶために活用します。どちらか言うとJavaScriptがメインに扱っていますけど(プレミアムコースを見る限り)Unityに限って言えば今後C#のみ適応するとか聞いたので補助教材として利用になるでしょうか。細かいことはUdemy講座を終了してから考えます。

 

・機械設計

機械設計といいますが、対象は材料力学かな、と思います。単元としては

・SN線図

・JIS鋼材、非鉄金属(アルミ系)

・曲げ剛性、断面二次モーメント

・曲げ加工

・トラス構造、ラーメン構造

流体力学(圧損、粘性)

教材は手持ちのテキスト(暇があるときに紹介)や外部講座で学んだ資料になります。下2つ以外は簡単にですが勉強しているので、それらの復習になると思います。ただ、計算式は紙でやりますのでweb上にどうやって反映させようか悩みます。ブログでは合金の結晶構造(相変態、結晶構造、SUS材の特性etc…)をまとめていこうかいかないか。

 

Excel

Excelエキスパート認定への道【MOS資格エキスパート試験対策オンライン講座】エクセル兄さんのスピードMOS合格コース』

https://www.udemy.com/excel-expert/

業務上必要になってきますExcelの操作をメモ変わりに書いて行こうというものですので、特になにを勉強するとかはないです。

春のセールをやっていましたので、Udemyにて講座は購入しましたが、30日以内に手をつけられるか不安なので、返金処理するかもしれません。

今現在困っているのはフィルター抽出やグラフの見栄えの調整なので、どちらか言うとデザイン系に関する講座のほうがよかったかもしれません。