Unity1weekに参加したよ まとめ(お題:逆)
まぁ表題の通りなんですけど、
余力があるので振り返ろうと思います。
下の方はちゃんと技術的っぽいことを書いているぞ。読んでね。
作ったゲーム
日曜日(2/23)
あほげーの打ち上げ放送のためにTOKYOへ移動
乗る新幹線を間違えるとかいう前代未聞の失態を犯す
更にケーブル忘れたりキーボードお願いするの忘れたりして
アキバで買い物 必要だったケーブル(miniディスプレイポート/HDMI)はマニアックすぎてビックカメラには無かったがヨドバシにはあった
もうずっとヨドバシさんについて行きます
月曜日(2/24)
折角だから、とTOKYO観光。
お題が発表されているのは知っているが、今回はあほげーとイベントの広報で忙しかったし今週は休みたいからパスしよう、とか考えている。
Nintendo TOKYOのTシャツほしかったけど売ってなかった
販売数限定だったの? 悲しい……
水曜日(2/26)
( ゚д゚)ハッ!
まちがい探し……まちがい探しなら今から作っても間に合うのでは?
その名も「逆まちがい探し」!
木曜日(2/27)
思い付いてしまったので仕方なくゲームを作り始めることに。
うすぼんやりと見逃そうと思ってたけど思い付いてしまったので製作開始…… #unity1week
— neoac`o´ (@neoaco) 2020年2月27日
まちがい探しなら、とりあえず表示するものが必要!
MagicaVoxelで作った方が速い。
ササっと作れるものといえば公園パック(何度も作ってるのですぐつくれる)。
木×2、銅像、噴水……というか池、花壇、ベンチ、UFO、ハト、ネコ、イヌ。あと空き缶。
イヌが抽象的な何かになった気がするがこれはイヌです。
犬に詳しくない人による犬 #unity1week pic.twitter.com/Xtp5Yk7Elg
— neoac`o´ (@neoaco) 2020年2月27日
そして
新しいバージョンのユニティをインストールし始めたのでしばらくやることがない
— neoac`o´ (@neoaco) 2020年2月27日
インストールってめっちゃ時間かかるんだよね。
もういいや、農業やろっと🚜
金曜日(2/28)
昨日作ったオブジェクトをUnityにインポートして、置いてみる。
まぁ、いいんじゃない?
本当はFPSで公園内をうろうろする感じにしたかったけど、パソコンがぽんこつになってきて遊ぶときに重すぎて悲しいし、なんかそこまで作るのめんどくさいなと思ったので、雑誌のまちがい探しみたいに二つの画面から選ぶだけ!のお手軽モードにすることに決めた。
まずは画面をつくる!
Inkscapeで枠を作って……カメラを二つ準備して、枠に嵌めていい感じにする。
Unityのカメラって、何を映して何を映さないのかをレイヤーで決められるので、
両方映すもの、片方にしか映さないもの、どっちにも映さないもの、の四つのレイヤーでオブジェクトを管理すればおっけー。レイヤーもスクリプトから動的に変更できるので安心。
例: 花壇.gameObject.layer = 0; // 0はDefaultレイヤー
あたま良いな~~~。
これで同じところに置いても右と左で違うものを表示できるぞ。
左右で同じものを映した時にどうやって同じものを同じ場所に配置しようかと思ってたんだけど、同じものを映せばいいんだよ。天才だな~~~~。
池が。実際に配置してみると灰色の塊にしか見えない。
オブジェクト作り直します……。
ほかに公園っぽいものって何だろう、滑り台かな?
えっ……滑り台難しくない? 上の方とかどうなってんの? 支えは? 階段は?
うわ~~~~~こんなよくわかってないもの作り始めるんじゃなかった……(でも辞めない)
それにしても、なんか今日遅くまで作業していた割に全然進んでないんだけど何が……アッ
ウッドチップの売り場がわかった 製材所のはしっこに専用の荷下ろし場があるのね……現実に戻ってこれたのでunity1weekの続きやろう
— neoac`o´ (@neoaco) 2020年2月28日
今日は大まかなところ作り終えたい
結構な時間まで農業やってたわ🚜
土曜日(2/29)
夫が風邪で布団から出てこないので、もくもくと作業ができる。
夫が居るなら作業している場合ではないので……。
滑り台を完成させて、配置。池よりマシ。
配置されるオブジェクト、アクセスするたびにランダムに配置されたいということで
書いてたんですよ、まぁ3状態/5種類しかないし配列使うのも面倒だからランダムとif文でいいかなって……。
あたまがこんがらがってきた
中止だ中止!
おとなしくListを種類ごとに作って、SystemとSystem.Linqをつけて
Listをシャッフルだ!
中身が! 2つ3つしかない! Listを! シャッフル!!!!!
過剰な力のようなきがするけど気にしない。
using System.Linq; using System; ListSame = new List<GameObject> { same1, same2, same3}; ListSame = ListSame.OrderBy(i => Guid.NewGuid()).ToList();
これを使うとRandomがUnityEngineなのかSystemなのかわからんってエラーが出るからランダムを書くのがめんどくさくなるんだけどListのシャッフル便利すぎて霞む。
おとなしく大量の赤波線を一個ずつ修正していく。
やったー。これでいい感じにランダムに出たりでなかったり前回とちょっと位置が違ったりして出るぞ。
あとは……どうやって左右同じの場所をクリックするか……。
とか悩む前にササっと検索。
良いのがあるやんけ!!!!
Rayを飛ばさずに簡単にオブジェクトのクリックを検知 | のっぴの備忘録
これはラクチンだな~~~~
Buttonと同じ感じで使える。
Rayをいちいち書かなくて済むし、今回みたいに複雑じゃない3Dの時はこれで一発だな。
// 2Dの時はこれで十分 void OnMouseDown(){ クリックされたときの処理 }
いや~、できたでき……あれ? 急にクリックが効かなくなったぞ……?
これ、どうも内容はRayを飛ばして検出してるらしいんだけど、
手前にUIのimageとかあると遮られちゃうみたいなんですよね
透明かどうかは関係ない
UIのどこかにある、この「Raycast Target」ってやつをOFFにすると、Rayを遮らなくなるので安心
前面にimageを貼ってる私が悪いんですけどね
全体のクリック数をカウントしたり
ゲーム開始のカウントダウンをつけたり
こまごまとしたものをつけて
とりあえずほとんどできたんですよね
#unity1week ランキングつけようかどうしようか悩む……ランキングある方がみんな遊んでくれる気がするけど
— neoac`o´ (@neoaco) 2020年2月29日
なんでこんなうすぼんやりと悩んでいるかというと
まぁ手早くつくるならnaichiさんの準備してくださった
NCMBを利用したランキング設置なんですけど
【Unity、WebGL】なるべく簡単にオンラインランキング機能をつけるサンプル - naichi's lab
すげーーーーーべんりなんですけど、
アクセスがなくなると2か月でデータがなくなっちゃうんで
ちょっと悩んでるんですよね
折角遊んでもらってもいつの間にかなくなっている……
自前のサーバで何とかならないかな
その前はGoogleスプレッドシートとやる方法があったけど、
あれめちゃくちゃ遅くてちょっと戻りたくない
ねぇ、ちょっとそこのサーバのことがよくわかるさん、自前のサーバでやりたいよねぇこういうの、ねぇ、ねぇ、
夫「できなくはないけど……」
やったー次のあほげーくらいまでに何とかお願いします
(本人はもうこのやり取りを忘れていると思います)
日曜日(3/1)
やっぱりランキングはついてる方がいいよな~~~
どんなランキングにしようかな~~~
といっても、このゲーム、タイムとクリック数しか見るところないので、
それを捏ね捏ねするしかないわけで。
・時間のはやさを競うすばやさランキング
・誤クリックの回数を競う?せわしなさランキング
(正確にはせわしなさは時間当たりのクリック数をポイントのもとにしている)
の二つをつけることに。
本当は二つ並べて表示したいんだけど、そういう仕組みはないっぽいのと
そんな機能がんばってつけるようなこだわりがあるわけではないので
二つのランキングへのボタンをつけておしまい!
#unity1week アップロードした!
— neoac`o´ (@neoaco) 2020年3月1日
「逆まちがい探し SameSeek」
逆に、逆に同じところを探して下さい!!!https://t.co/KAQF6nYlcz
今日の夜8時にならないと公開されないけど、みんなよろしくな!
マジ?! 16時に投稿を終えてる?!?!
新記録なのでは?!?!?!
というわけで完成したのであった。
すばらし!!!
Unity1week(お題:つながる)に参加しました!!!、おまけの一日
春眠暁を覚えず。
いつでもねむいneoacoです。
さて、昨日でunity1weekは一応終わったんですが、
普通にスクリプトミスしてたので修正することに。
ついでに音を付けたり、スクショとって載せたりしました。
そんなこんなで、今後重大なバグとかがなければこれ以上は触らないので、
ここまでは許して……というお気持ちです。
最後の方は作業量が多すぎてもうスクリプトも途中のスクショもないんですが、
ゲームも公開出来て、ブログも書き終えて、
いっぱい頑張ったので自分的にはとても満足です。
パーティクルとかちょっとわかってきたので、またほかのゲームでも使いたいなぁ…などなど。
あほげーの時は必死にやってるだけなので、こうやって振り返りつつ作るのもいいですね。
ではでは
ゲーム遊んでくださいね!!!!!!!!
unityroom.com
Unity1week(お題:つながる)に参加しました!!、六日目
今日は朝からほとんどの時間を費やし、
ちょっぴり遅刻しつつもゲーム公開へ漕ぎ着けました!
まずは完成したゲームを見てくださいっ
unityroom.com
いろいろ頑張ったのできちんと記録しておきたいんですが、
今日は疲れたので、明日追記とかで書いていこうと思います。
爆発は芸術だー🤯
ここから追記
最終日はいろんなことやり過ぎて何をしたのかもう覚えてない……。
体裁を整える部分(タイトルやゲーム終了後の部分)は見た通りなので、ざっくりとカットで……。
1.爆発が連鎖してほしい
1-1.爆発との接触判定
爆発する霊魂に巻き込まれてほかの霊魂も爆発してほしい……。
あれっ、パーティクルのCollisionが霊魂に反応しないぞ!?
どうも、動いているisTriggerのモノにはRigidbodyがついてても反応しないようだ。
諦めたくない……。
というわけで、パーティクルのCollisionはさっそく外しまして、別のトリガーを作ることに。
投げるのに親は使っているので、もうパーティクルに新しくColliderを付けるしかない。
えーっと、爆発のサイズに合わせて円のColliderをつけて…
はじめはenabel = falseに設定しておいて、パーティクルが再生されるときにON!
調査によるとこれがONになったときはEnterの反応があるので、
OnTiggerEnter2Dでプレイヤーも霊魂も呼び出そう。
これで反応するようになった。
1-2.連鎖爆発
爆発に巻き込まれた方の霊魂、自分が爆発する時と同じ関数を読みだせばいいだけなのでらくちん。
2.ゲームっぽさとは……
一日目の案では
- 敵は複数種類
- ボスも出したい
とか言ってましたが、もはやそんなものを作っている余裕はない
そのかわり、まぁまぁの密度で敵を配置し、ぼんぼん爆発してもらおうとおもいます。
あとは……じ、時間とか計ってタイムアタック的な……
ついでにベストタイムとかを出しておけばいいかな。
ワールドランキングはちょっとめんどくさいのでパス!!!
3.そして遅刻
間に合わねー! と言いながら作業し、
間に合わねー! と言いながらビルドして、
間に合わなかったー! とゲームを公開しました。
間に合わなかった……。
いや、でも、なんとか公開したのでいいかな、と。
いや~、頑張った頑張った。
Unity1week(お題:つながる)に参加しつつあります、五日目
締め切りが明日だとは信じられないほどの微妙な進捗で、
あのあの、スプラトゥーンのフェスやりたいんですけど、あのあの……neoacoです……。
時間が惜しいので試行錯誤の経過はすっ飛ばして結果だけ書きますよ。
出来上がったスクリプトとかは最後にまとめて掲載します。
1.投げる! 投げるぞ!
1-1.投げるってばよ
昨日の記事の最後で「うまくいかない~」と言っていた、捕まえた後に投げる動作。
原因がわかりました。
「OnTriggerEnter2Dでとらえた後、オブジェクトのlocalPositionを変更するとExitする」
ということでした。
1-2.他にもうまくいかないことあったよね
なんかアニメーションがループした後じゃないとキーが効かないという話だったんですが、
1-1の原因の所為だたっぽいです。ループ関係なかった。
2.絵を描き直すぞ!!!!
床とかおばけとかプレイヤーとか、もう全部描き直した。
導入用の絵と、背景用の絵も。サイズ感がガバガバだが赦してもらうしかない。ここを気にいていてはもう間に合わない。
床はちょっと工夫をして、「Sprite Editor」で緑色の枠を動かして9スライス的なアレをアレしました。
これで画面に奥行きが出た気がする。
3.あたり判定を……どうする?!
どうするもこうするもないんですが、いろいろ試したんだけどやっぱりうまくいかなくて、
パーティクルにCollisionを設定することにしました。
折角の爆発が壁やプレイヤーに阻まれる結果となるわけですが仕方ないです。
あれやこれやしている暇がない……。
どう考えても息抜きのマイクラが長すぎたな……。
しかしこれで、パーティクルが当たるたびに教えてもらえるようになったので、良しとしよう。
設定は簡単、CollisionをONにして、TypeをWorldにして、SendCollisionMessageをオンにするだけ。
あとはパーティクルにスクリプトをくっつけるだけ。スクリプトは最後にまとめて掲載しますよ。
4.ライフ!
プレイヤーにもライフがないとゲーム感がすくなすぎるよね。
というわけで、とりあえずライフは3ではじめることに。
適当に画面のはしっこに表示をしておけば安心。
4-1.いっぱい痛い
パーティクルは全部で100個もでるわけで、一回の爆発で一回しか当たらないなんてそんな都合のいいことは起こらない。
というわけで、一度あたったらしばらく当たらないようになってほしい。
はい、新規アニメーションです……。
パーティクルに当たる>ダメージフラグをON>ONの間はパーティクルに当たってもライフを減らさないようにする>時間が終わるとフラグをOFFにする
という感じ。
よくある、なんか点滅してるような感じに。とりあえず赤く点滅してもらいました。わかりやすくていいということにしておきます。
5.その他困っていたこと
霊魂はアニメーションで動かしており、これだとColliderだけではTriggerが反応しないんですよ。
そこで適当にRigidbodyを付けていたのですが、ここの「適当に」がたいへんに困るバグを発生させておりました。
- バグの現象
- 霊魂の下を通ると、コライダー同士が接触してないにもかかわらずOnTriggerEnter2Dが呼ばれたりよばれなかったりする
- 解決方法
- RigidbodyをKinematicにする
ええ~これだけで~~~? 今日朝からずっと悩んでたのに~~~?
まじか……本当にこれだけでうまくいったわ……。
というわけで、みなさんRigidbodyの設定はきちんと確認しましょう。
6.まとめ
というわけで、今日変更したり追加したりしたスクリプトを掲載します。
(PlayerCtrlの追記・変更) // つかまえる動作に関するもの GameObject enemyP; bool gettingEnemy; // ライフ・ダメージ管理 int PlayerLife; [SerializeField] Text lifePointText; [SerializeField] Animator PlayerAnimator; bool isDamage; // Start is called before the first frame update void Start(){ PlayerAnimator = GetComponent<Animator>(); rb = this.gameObject.GetComponent<Rigidbody2D>(); CameraPosition = new Vector3(0,0,-10); gettingEnemy = false; PlayerLife = 3; lifePointText.text = "Life : " + PlayerLife.ToString(); isDamage = false; } // Update is called once per frame void Update(){ // 投げる入力はここで管理することにした if (Input.GetKeyDown(KeyCode.L)) { if (gettingEnemy == true) { // 左右確認 float checkLR = this.gameObject.transform.localScale.x; // 投げる力を設定 Rigidbody2D enemyPRb = enemyP.GetComponent<Rigidbody2D>(); enemyPRb.simulated = true; enemyPRb.AddForce(new Vector2(checkLR * -150f, 450f)); gettingEnemy = false; // とんでいくときには親子関係を解消しないとプレイヤーの向きに影響されてしまう enemyP.transform.parent = null; } } }
(enemyCtrlの追記・変更) [SerializeField] ParticleSystem part; void GetSet() { // 親をプレイヤーにするのはプレイヤー側で設定する // 点滅アニメーションを始める enemyAnim.SetBool("beSet",true); Rigidbody2D enemyRb = this.gameObject.GetComponent<Rigidbody2D>(); // 親にもRigidbodyがついている(投げるため) // 競合して投げれなくなるのでここでOFFにする enemyRb.simulated = false; } public void GetExprosion() { // パーティクルを再生し、終わったらgameObjetを消す part.Play(); Destroy(transform.parent.gameObject, part.duration); }
(ParticleCtrlは初登場なので全文載せます) using System.Collections; using System.Collections.Generic; using UnityEngine; public class particlCtrl : MonoBehaviour{ ParticleSystem part; // Start is called before the first frame update void Start(){ part = GetComponent<ParticleSystem>(); } private void OnParticleCollision(GameObject other) { if (other.tag == "Player") { other.SendMessage("expDmg"); } } }
まだまだ調整が足りないのですが動かすとこんな感じです。
残りは
1.導入部分
2.ゲームの終わり方の設定
3.エンディング
4.爆発を連鎖させたい
5.さっきテストプレイしたら何か問題があった気がするけど思い出せない
おいおい、めっちゃりょうあるやんけ!
フェス出来るかな……
明日は最終日なんですがスプラトゥーンしたいです。
あっまちがえた、明日もがんばります。
Unity1week(お題:つながる)に参加しつつあります、四日目
気分転換に、たまりにたまった牛乳パックを切り裂いてやりました。
むっふっふ。neoacoです。
昨日までの遅々たる進捗に、今日こそ頑張るぞ!と思っていたのですが、
パーティクルのあれやこれやを調べているうちにものすごく時間が過ぎており、
今日もそんなに進捗がない……いやそんなことはない、なんていったってパーティクルが出来上がったんだ、これは素晴らしい進捗だと思うんだよ!
そういうわけで、今日の作業を振り返ろうと思います。
1.爆発エフェクトをつくりたーい
爆発はロマン!
……とはいえ、公式assetの爆発エフェクトは自分の絵とのクオリティ乖離が激しいので、
もうすこし自分のクオリティに見合ったエフェクトを作らねばなりませぬ。
今日はほとんどパーティクルの調べごとに費やしたけど、結局今のところは作っただけとそんなに変わらない状況。からあげ画像を丸く抜いてフチをぼかして、シェーダーに設定。
Particl/standard surfaceに設定して、Rendaring ModeをAdditiveに設定するといい感じです。
爆発に当たったらプレイヤーがダメージをうけたり、霊魂の爆発が連鎖したりしてほしいんだけど、
Colliderを使うとぶつかって止まるし、Triggerは思った感じの挙動じゃないし、
あたり判定はちょっと保留。明日いいアイディアが浮かぶといいなぁ。
このパーティクルは、昨日のenemyの子としてプレハブに設定しておきます。
2.つかまえた後は持ち歩きたい
体当たりで霊魂に爆弾を仕込むというお手軽モードに決定したわけですが、
「つかまえて」という文言に従って、爆発するまでは持ち歩けるようにしたいですよね。
でも、本体にはアニメーションがついてるからポジションを変えてもついてこないし、
えーっとえーっとえーっと
配置の時に使う入れ物ごとプレイヤーにもたせればいいのか!
いや~こういうことにすぐ気付くなんてすごいな~、僕はなんてすごいんだろう~~~
(誰もほめてくれないので自分でほめるスタイル)
(PlayerCtrlに追記) void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.tag == "enemy") { collision.gameObject.SendMessage("GetSet"); // 親をプレイヤーへ変更する collision.transform.root.parent = this.transform; GameObject enemyP = collision.transform.parent.Find("/Player/enemyP").gameObject; enemyP.transform.localPosition = new Vector3(0.16f,1.44f,0); // 投げる // ここはうまくいってない if (Input.GetKeyDown(KeyCode.L)) { // 左右 float checkLR = this.gameObject.transform.localScale.x; Rigidbody2D enemyRb = enemyP.GetComponent<Rigidbody2D>(); enemyRb.simulated = true; enemyRb.AddForce(new Vector2(checkLR * 150f,150f)); } } }
3.うまくいってない
おっかしいな~ これで投げられると思ったんだけど……。
プレイヤーが体当たりしたときには
- アニメーションの変更
- enemyの親ごとPlayerの子オブジェクトにする
を行っているんだけど、Lキーが効く(RigidbodyのSimuratedがONになる)のは一度アニメーションが終わってからなんだよね……
適当に力を入力しているからか、ビューンって飛んで行っちゃうし、これはあきらめてアニメーションにするしかないのかな~
私が楽をしようと思って実装すると大抵うまくいかないので、
まぁそういうことなんだろうなと思っております。
アニメーションつくってウンヌンのあたりはまた明日に。
ん~、アニメーションかな、それともTimelineかな……Timeline思った感じじゃないからやだな……でもアニメーションではない気がしてきた……
間に合わない気がしてきたので、この後は背景を描いたりします。
ンヒー
Unity1week(お題:つながる)に参加しつつあります、三日目
S~A~K~E~~~♪
兼業ソロモン王(新米)のneoacoです。
マイクラで彷徨いまくってようやく見つけたジャングルバイオーム、ベッドを壊した後に水中で溺死ゾンビにボコボコにされ、すべてを失った上にはるか遠い初期リスポン地に帰ってきたという悲しみを背負いつつ今日もUnity1weekの作業をしました。
1.敵にアニメーションを付ける
アニメーションのことはよくわかってないのですが、いつもなんか雰囲気でどうにかしています。
敵がじっとしていると面白くないですよね。
まず敵にColliderをつけて、プレイヤーとぶつかってもいいようにTriggerにします。
"enemy"のタグをつけるのも忘れずに。
作るアニメーションは
- 持ち場でウロウロしている状態
- 爆発前の点滅している状態
- 爆発と昇天
- 何かの時のための待機状態
爆発はまだ絵が足りないので、残りの三つをまず作ります。
すでにプレハブ化していたので、プレハブを開いた状態でアニメーションを付けます。
これ便利だな……ほかのオブジェクトに邪魔されずにアニメーションだけ付けられるじゃん……
左右にウロウロするのと点滅しているのを作って、ウロウロしている状態のアニメーションをデフォルトにセット。
そこから点滅への矢印を付けて、そこにboolをセット。
この遷移の時はバッと変わってほしいのでExit timeのチェックを外しておくといいらしいとの噂です。まちがってたらごめんぬ。
ぜんぶやると、画像のような感じになります。
2.ゴーストキャッチ
さて、敵の実装ができたので、次はプレイヤーが「つかまえる」行動を作りますよ。
いろいろ考えたけど、「つかまえる」「なげる」の二段階で、「つかまえる」は体当たりのみでできるようにすることにします。
敵はTriggerにしたので、プレイヤーのスクリプトに追記をするのはこんな感じ。
(PlayerCtrlに追記) void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.tag == "enemy") { // 捕まえたことを相手に送信 collision.gameObject.SendMessage("GetSet"); } }
メッセージを送られたからには敵側で受け取らねばならぬ。
(enemyCtrlを作って追記) // Start is called before the first frame update void Start(){ enemyAnim = GetComponent<Animator>(); } void GetSet() { // 点滅アニメーションを始める enemyAnim.SetBool("beSet",true); }
これを敵のプレハブへ追加すれば、プレイヤーが触ると点滅するようになる。
3.ついでにカメラを制御する
カメラがプレイヤーについて回ってほしいので、
(PlayerCtrlに追記) using UnityEngine.UI; [SerializeField] Camera MainCamera; Vector3 CameraPosition; void Start(){ // 追記 CameraPosition = new Vector3(0,0,-10); } void Update(){ // 追記 // カメラを追従させる if (this.gameObject.transform.localPosition.x > 0f) { CameraPosition.x = this.gameObject.transform.localPosition.x; MainCamera.gameObject.transform.localPosition = CameraPosition; } }
これで、スタート地点よりは左に行かないけど、右にはずんずん行けるというカメラワークになります。よしよし。
どう考えても間に合うペースじゃないんですが、なぁに、大丈夫、こっちにはまだ土曜日がある(油断)
明日こそ頑張ります。
Unity1week(お題:つながる)に参加しつつあります、二日目
デビルハンターとの兼業はつらいぜ。neoacoです。
いつも朝に夫を送り出してから昼まで二度寝してるんですが、今日は寝付けなかったので朝から作業をしました。
大量のスクショを撮ったんですが、詳しく書くような時間はあまりないので、
どれくらいの時間でどんなもんをしたのか、みたいな感じでまとめます。
1.Unityを最新版にする
たしかなんか更新しろってメールが来てた気がするので、その辺のチェックから。
最終的に新しいのを落としてきてインストールすることにしたので40分くらいかかってやる気も萎えてき……が、がんばるぞ!
ということで、Unity 2018.3.8で開発です。
2.最低限の仕組みを作る
まずはプレイヤーが動けばいいよね、という気持ちで、
ざっくりと床とプレイヤーを作ります。
画面のサイズを800*600pxにして(いつもこのサイズで作っている)昨日作った画像を取り込んでsprite Modeをマルチにしてスライス。
床>>
1.切ったスプライトを画面に置く。レンダーのModeをTiledにする
2.BoxColliderを付けてAuto TilingをON
3."ground"というタグを追加して、床材につける
4.この状態でプレハブにする
5.適当に配置する
長さはそれぞれのスプライトレンダーのところにある幅を調整していい感じにする。テキストボックスで式を書いていいのラクチン~~`o´
ジャンプさせたいので高さの違うやつを二つ置いておけば、雰囲気が出ます。プレイヤー>>
1.スプライトエディタで制御点を下の真ん中に変更
2.画面においてポリゴンColliderとRigidBody2Dを付ける
3.ポリゴンが気に食わないので手で修正する(後で絵を差し替えるつもりなので無駄な作業)
次は、とにかく早くプレイヤーに動いてほしいので、
スクリプトを書き始めることにします。
試行錯誤の末に書いたスクリプトはコチラ。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCtrl : MonoBehaviour{ Rigidbody2D rb; float moveRate = 0.05f; float jumpForce = 500.0f; Vector2 PlayerPosition; bool isGround; // Start is called before the first frame update void Start(){ rb = this.gameObject.GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update(){ // 移動はWASD式 // 右 if (Input.GetKey(KeyCode.D)) { // 右に移動したら絵が右を向くようにする this.gameObject.transform.localScale = new Vector3(-1,1,1); PlayerPosition = this.gameObject.transform.localPosition; PlayerPosition.x += moveRate; this.gameObject.transform.localPosition = PlayerPosition; } // 左 if (Input.GetKey(KeyCode.A)) { this.gameObject.transform.localScale = new Vector3(1,1,1); PlayerPosition = this.gameObject.transform.localPosition; PlayerPosition.x -= moveRate; this.gameObject.transform.localPosition = PlayerPosition; } // ジャンプ // フラグをセットしておかないと無限にジャンプできてしまう if (isGround == true && Input.GetKeyDown(KeyCode.Space)){ rb.AddForce(new Vector2(0, jumpForce)); } } void OnCollisionEnter2D(Collision2D collision) { // 床についているとき if (collision.gameObject.tag == "ground") { isGround = true; } } void OnCollisionExit2D(Collision2D collision) { // 床についていないとき if (collision.gameObject.tag == "ground") { isGround = false; } } }
わかりやすいようにきちんと名前を付けたつもり。
RigidBodyがrbなのは、もう許して、だってこのコンポーネントここでしか使わないんだもん……
とにかく、これをプレイヤーに貼り付けて、ゲームビューで確認。
動くし、良いんじゃないんですか。ね。そういうことにしましょう。
Unityのアップデート後、スクリプト書き終わるまででおおよそ2時間。
さーておひるごはんだ。
3.揺れた…
揺れたね。ちょっと遠かったんでゆっくりユサユサされ、敵にAnimationを付けようとPCとにらめっこしていたneoacoさんは酔って使い物にならなくなり、布団に入ってお昼寝をしました。
4.おはようございます
もう今日は閉店ガラガラ、ワァオ!
明日は頑張ります。