Unity備忘録10頁目「Prefabを作ってみる1」

江上宿六です。

 

今回はPrefabというのを作ってゲーム内でオブジェクトを自動生成してみます。

これは例えばシューティングだったら弾を出したり敵を出したり、そういう

似たようなオブジェクトを大量に出したりするのに使えたりするものです。

読みはプレハブでいいと思います、建築とかで見かけるあのプレハブです。

 

今回は新たにプロジェクトとシーンを作ってやりたいと思いますが、というか

シーンの保存についてやりましたっけ。 メニューバーのFileからSaveScene等を

選ぶとシーンが保存されますので、適当に名前を付けて保存してくださいね。

 

さて、新たなプロジェクト、新たなシーンが作られたら早速ヒエラルキー

Createから3DObject→Sphereと選択し、Sphereを追加しましょう。 球です。

インスペクターでPositionを(0,5,0)として実行してみましょう。

f:id:y6yegami:20180714170024p:plain

まぁ、球がちょっと高めの所に配置されただけのなんの変哲も無い結果ですね。

では少し変わった事をしてみましょう。 ヒエラルキーSphereを選択して

インスペクターの中のAddComponentというのをクリックしてみましょう。

f:id:y6yegami:20180714170840p:plain

これはオブジェクトに様々な効果を追加できるもので、凄い便利なものです。

今回はPhysics→Rigidbodyと選択し、この球にRigidbodyを付加しましょう。

f:id:y6yegami:20180714171242p:plain

こんな感じのが追加されるはずです。 この中身については今は別に良いので

再び実行してみましょう。

f:id:y6yegami:20180714171529p:plain

球がなんか下の方に移動していって画面内から消えました。 そうなんです。

このRigidbodyというのはオブジェクトを物理挙動に従って動かせるもので、

それゆえに重力を受けて下方向(-y軸)に加速しつつ動いていったわけなんです。

スクリプト使わなくてもこんなの出来るって凄い。

 

こういう物理挙動を行う場合は大抵Colliderというのもセットで扱われます。

これはいわば当たり判定的なもので、今回のSphereには最初からついています。

因みに今まで使っていたCubeにもColliderがついていましたよ。

 

この辺はさておき、このSphereは画面外に消えても存在し続けているので

ある一定の高さまで行ったら消えるようにしてみましょう。 C#Scriptを追加し

SphereControllerとでも名付けてスクリプトを記述しましょう。

f:id:y6yegami:20180714173412p:plain

transformのposition.yが-5.0fを下回ったらgameObjectをDestroyするというもの。

このgameObjectというのはこのSphereの事ですね。 そもそもtransformも

gameObjectのインスペクターのtransformの事を指していると思うんですがね。

まぁ、別にどうでも良いですのでスクリプトをアタッチして実行してみましょう。

f:id:y6yegami:20180714174100p:plainf:id:y6yegami:20180714174106p:plain

一定の位置までSphereが落ちたらヒエラルキーからSphereが消えているのが

確認出来ます。 こうやって消していかないとメモリを食ったりしますからね。

 

さて、こうやってSphereが落ちて消えるというものが出来上がりましたが、

このSphereを沢山作りたいとなった場合はどうするべきでしょうか。

沢山SphereをCreateしてアタッチしまくるというのはなんか違うと思うし

流石にこれは手間ですね。 そこで使えるのがPrefabというものなのです。

 

実際作っていくのは次回ですね。 やっぱり縦長になってしまっているので。

Unity備忘録9頁目「様々な入力2」

江上宿六です。

 

マウスやキーボードの入力は前回のでだいたい良いと思うんですが、

まだジョイスティックという大事な入力装置についての情報が残ってまして。

現在進行形で勉強中、ガチの備忘録というわけでもあります。

 

実はジョイスティックのボタン入力については前回やったGetKey~で普通に

取得出来ちゃいます。 ですがスティックに関してはちょっと違う方法で

入力を取得する必要があるのがわかりました。 それをやるためにまずは

こんなものを作ってみました。

f:id:y6yegami:20180713142352p:plain

C#Scriptを追加、CubeController2と命名してこんな感じに入力しました。

簡単に説明をすると左矢印を押すとCubeが左に動き、右を押すと右、

上下なら上下に動くという感じのものです、カメラから見ての動きなので

書き方や値に一貫性がありませんがそこはお許しを。

f:id:y6yegami:20180713142936p:plain

ともかくまぁ、キーボードの矢印でこういう感じの動きをしてくれると思います。

これをスティックで再現するためにはInput.GetAxisというのを使います。

f:id:y6yegami:20180713144418p:plain

Input.GetAxisは軸の傾きを-1.0f~1.0fの値で受け取ることが出来るもので、

x方向はHorizontal、y方向はVerticalという名前を渡してやる事で取得出来ます。

実行すると殆ど同様に動く上に、ちゃんとスティックでも動いてくれるハズです。

 

でもなんか釈然とはしませんよね、なんでそうなるかよく分かってないからです。

このHorizontalとかVerticalというのが何処から来てるのかもアレですからね。

 

ではメニューバーのEditからProjectSetting→Inputと選択してください。

インスペクターにInputManagerというのが表示されました。 Axisの項目を

開いてみてください。

f:id:y6yegami:20180713145522p:plain

ここです。 さっきのHorizontalとVerticalはここにあるやつの事なんですね。

2個あるのはさておき、とりあえずHorizontalの所を開いて中を見てみましょう。

f:id:y6yegami:20180713172715p:plain

項目が多くて嫌になりますが、ここではName、NegativeButton、PositiveButton、

同様にAltがついたNegativeButton、PositiveButton、Typeなんかを押さえれば

今のところはなんとかなると思います。

 

まずNameなんですが、言うまでも無く名前ですね。 上のスクリプトの所で

Input.GetAxis("Horizontal")としていますが、このタイミングでこの中身を

チェックしているという感じなのでしょうか。 名前を変えたら呼び出す方でも

名前を変えれば多分同様に動いてくれると思います。

 

NegativeButton、PositiveButtonは何のキーを押したら軸が負の方向に振れるか、

正の方向に振れるかというのを表しているんだと思います。 Altがついてるのは

代替のキーで、多分同じ処理が行われるハズです。

 

つまり書かれている通りだと、leftを押すと負に、rightを押すと正に振れる、

またはaを押すと負、dを押すと正という感じになるのであろうと思います。

現に実行してみるとaとdでも左右に動いてくれますからね。

 

Verticalの中身も一応確認してみると、down,sで負、up,wで正になっています。

そういう風に軸が傾くんだなあ、という風になんとなく覚えていただければ。

 

ここのTypeなんですが、KeyOrMouseButton、MouseMovement、JoystickAxisと

また色々とありますが、とりあえずさっき開いた方ではないもう一つの

Horizontalを開いてみてください。

f:id:y6yegami:20180713175740p:plain

えらいすっきりしてますが、TypeがJoystickAxisになっています。 Typeの下の

AxisはXaxisです。 Verticalの方を開くとTypeはJoystickAxisでAxisはYaxisです。

 

まぁ、どういう事かというとこのTypeをJoystickAxisにするとスティックの

傾きが取得出来るというもので、AxisがXaxisなら横方向、Yaxisなら縦方向の

傾きを取得出来るという感じだと思います。

 

それでまぁ、このInputManagerのここらの名前をGetAxisに渡してやると

それぞれ状態、傾きを取得してくれて扱えるという事になる感じですかね。

 

ここまでやってきたのは左スティックの入力でしたが、じゃあ右スティックは

どうすれば良いのかというと、Axisの所を3rdやら4thに変える事で取得が

出来たりしますが、これはジョイスティックのボタンの並びと同様で、

ジョイスティックによって違うので、そこは気をつけないといけないですね。

 

自分が使っているWiiプロコンを繋いだものはでは3rdが右スティックX、4thがY。

5thが十字キーX、6thが十字キーYという感じでした。 4thのY軸は正と負が

逆転していたのが謎でしたが、Invertにチェックを入れると逆方向にできます。

 

という事で今回はこんな感じです。 文字数が2000超えてますが、これは

横文字が多いせいで、そこまで冗長な感じにはなっていないと思います。

 

次回はオブジェクトの自動生成とかそういう辺りをやるかもしれないです。

Unity備忘録8頁目「様々な入力1」

江上宿六です。

 

前回はマウスの左右クリックでCubeを回転させてみました。 その実現のために

Input.GetMouseButtonDownを使いましたが、このInputにはマウス以外にも

色々な入力を取得出来るので、使えそうなものを記しておこうと思いまして。

とはいえまずはマウスの入力です。

 

・GetMouseButtonDown

・GetMouseButtonUp

・GetMouseButton

 

これらはマウスのボタン入力を取得できるものですが、それぞれ違いがあります。

GetMouseButtonDownはボタンが押された瞬間だけ真を返し、

GetMouseButtonUpはボタンが放された瞬間だけ真を返します。

GetMouseButtonはいつ真を返すかというと、ボタンが押され続けている間です。

 

試してみましょう。 Cube用に作ったスクリプトを変えるのは少しアレなので

新たにMouseControllerというC#Scriptを作り、ヒエラルキーでCreateEmptyから

空のオブジェクトを作って、そこにアタッチするようにします。

f:id:y6yegami:20180712185810p:plain

そしてこのように書いてみます。 一文ならこういう風に省略できるので、

分岐先が一文なら自分はこういう風にします、善し悪しはあるでしょうけども。

 

GetMouseButtonDownが真ならMouse Down!と表示し、

GetMouseButtonUpが真ならMouse Up!と表示し、

GetMouseButttonが真ならMouseと表示する、という中身です。

f:id:y6yegami:20180712193820p:plain

実行して左クリックをするとコンソールにこのように表示されました。

若干切り貼り感はあるのは、押され続けてる所が凄く長くなったからです。

ともかくマウスがクリックされ、押され続け、離されたという流れが分かります。

 

押し続けるというものは色々と使い道が思いつくと思いますが、離すというのは

どういう時に使えるかというと、自分の場合はコマンド選択とかをする時には

押した瞬間じゃなくて離した瞬間で処理を行う事が多いです。 誤選択とか

防げたりしますし、効果音と合わせると心地よさを感じますから、個人的に。

 

アクションのジャンプとかは押した瞬間で良いと思いますけども。

そうそう、溜め攻撃とかの処理は離したときにやると良いかもしれないですね。

  

さて、他の入力についても見ていきましょう。

 

・GetKeyDown

・GetKeyUp

・GetKey

 

これらはキーボード入力を取得できます。 Down、Upなどありますけど

これはマウスの方と同じです。 これの引数に渡すのはKeyCodeというもので

例えばキーボードのAを押したのを取得したい場合はKeyCode.Aを渡します。

f:id:y6yegami:20180712194803p:plain

 

f:id:y6yegami:20180712195104p:plain

実行してAを押した結果は、こういう感じです。

KeyCode.LeftArrowで左矢印、KeyCode.UpArrowで上矢印とかも取得出来ます。

3DゲームならWASDの方が一般的な気もしますけども。

 

これでマウスとキーでの入力はだいたい出来ると思います。

でもまだ入力したい装置がありますよねえ、それは次回やれたらやってみます。

自分もまだまだ勉強が不足していまして。

定例自分語り。

江上宿六です。

 

Unityの備忘録はどんな感じですかねえ、個人的には教本から逸脱していて、

本当に自分がどれだけ理解していて、構築できるかが勝負になっているホントに

ガチな自分向けの備忘録になってきているわけですが。

 

とは言っても自分がゲームを作るために培ってきた下地がですね、Unityでは

「それ普通に機能として用意してあるから」と突っぱねられるような懐の深さは

驚かされますね。 下地があるから擦り合わせて理解出来ているんでしょうけど。

 

ではあの空間の事です。

f:id:y6yegami:20180713200300p:plain

前の子が色々と反応を頂けていたので、新たな子についてはコンセプトだったり

全体的な出来は向上してましたが、正直どれだけ反応が頂けるか疑問でした。

結果はみんな優しい、暖かい世界だったという事です、鮮度があるうちは。

 

今はUnityの方にかかりっきりだったりで新たにモデリングは出来てませんが、

現在企画設計してるゲームのキャラを作ってお披露目することもあるかもですね。

もしくは既存の他のうちの子を作ったりとか、まぁ、そんな事は考えています。

 

追記

このようにして事故るのでTwitterをやってはいけない(戒め)

Unity備忘録7頁目「スクリプトを書いてみる3」

江上宿六です。

 

前回はスクリプトでCubeを回転させてみましたね。 ゲーム的処理ですけど

ゲーム感をあまり感じられない理由はインタラクティブ性といいますか、結局

操作をしていないからだと思います。 なので今回はその操作関連をやります。

 

 前回のスクリプトを改造して使おうと思うので、それがあれば楽が出来ます。

ということでプロジェクトビューのC#ScriptであるCubeControllerを開きます。

f:id:y6yegami:20180711190216p:plain

 Start関数を空にしました。 初期設定では移動量を設定しないというか、

宣言時の0のままにします。 次にUpdate関数の方に変更を加えていきます。

f:id:y6yegami:20180711190804p:plain

Input.GetMouseButtonDown(0)が真の時、中の処理を行う制御文です。

真になる条件はマウスの0番目のボタンが押されたときになるわけですが、

これは単純に左クリックの事です。 とりあえずこれで実行してみましょう。

f:id:y6yegami:20180710135723p:plain

起動時は停止しているCubeですが、左クリックをすると回転を開始しました。

このようにしてマウスの入力を検知します。 ではこれを改造していきます。

まず自動で回転速度が減速するようにしてみましょう。

f:id:y6yegami:20180712141014p:plain

 19行目で回転を適用し、その後の20行目で回転速度に0.98をかけています。

こうする事で徐々に回転速度が小さくなり、最終的には止まって見える程に

遅くなります。 一定の値を下回ったら完全に止めるような処理があっても

良いとは思いましたが、今は別に必要ないと思ったので無しです。

 

実行すると左クリックで動きだし、徐々に回転が遅くなっていったと思います。

更に何か要素を足してみましょう。 右クリックをすると逆方向に回転したり、

クリックをする度に移動量が増えていくようにしてみます。

f:id:y6yegami:20180712143446p:plain

Input.GetMouseButtonDown(1)で右クリックを検知できます。 また、回転速度は

代入ではなく加算と減算にしてやる事でクリックの度に回転速度が増減します。

実行するとほぼ説明通りに動いたと思います。 画像も用意出来たら良かったと

思ったんですが、動きがあるやつを用意するのはなかなか困難でして。

 

ともかくこのようにして入力を検知する事が出来ます。 もうこれで何か

ルーレット的なゲームは作れたりするでしょう。 なんせ参考にしたのが

ルーレットのゲームなわけですからね。

 

次回はこの入力周りをちょっと特集するというか、まとめたい感じです。