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.おはようございます
もう今日は閉店ガラガラ、ワァオ!
明日は頑張ります。
Unity1week(お題:つながる)に参加しつつあります、一日目
無職ゲームクリエイターのneoacoです。
有職になりたいです。
それはさておき、Unity1weekというゲームジャムイベントがあります。
unityroom.com
一週間もあるのでクオリティ高いものがいっぱい出てくるんですが、まぁ枯れ木も山の賑わいということで、頑張ろうかなと思います。
実は様子見を決め込んでたんですが、お題を見てしまい、頭から離れなくなったのであきらめてゲームを作ることにしました。
その実況というかなんというかそんな感じです。
0.案出し
いつもは紙に書くのですが、ブログにしたいなと思ったので頑張ってパソコン上で案出しをしました。
個人的には紙がおすすめです。なんてったって裏紙でもいいからね。
ということで、お題の「つながる」からどんなゲームが作れるかな~、どんな要素があるかな~、と書いてみることにします。お題そのままでもいいけど、へんなのを思いついてしまったので、採用しました。
次に、プレイ画面をかんがえます。
あほげー(https://ahoge.info)だったらFPSを採用するけど、まぁ日数もあるし下の2Dサイドビューにしようかな。
描くこと多そうですでにげんなりしつつある。
1.目的 & 2.動機
「つかまえて」「なげる」というルールは1枚目で決めたので、
①何をつかまえて ②どうして投げるのか
を決めなければなりません。
つかまえるものは描きやすくてわかりやすいもの(上段)
でも投げなければならないので、
投げても怒られなさそうなやつがいい(下段)投げたら爆発させたい……と思ってしまったので、爆発してもよさそうな霊魂を採用です。
鎮魂の儀って描きたかったんだけどチンがうまく書けなくてひらがなになってしまいました。
ついでにどんな見た目の霊魂にするのかもスケッチ。
3.主人公を決定する
ユーザーの雰囲気からしてエロい女を出した方がウケがよさそうだけど、私の性愛対象は男性なので男の子にします^q^
無理に自分の性癖じゃないものを主人公にするとモチベーションが維持できないので、ここは自分の正直に決めるのがよいと思います。霊魂とはいえ爆発させるので、安全に配慮した格好にしました。
女の子だったら巫女とかの格好で良かったのでは。まだ間に合……いや、男の子で行くぞ。
4.ルール
ルールというか、ゲームシステムの話。
ここは作っていけるかどうかの重要な点なので、よく考える必要があるのです。
「つかまえてなげる」という主題上、アクションゲームなわけで、
取り得るパターンはざっくり2つ。案1はつくりやすいんだけど、ちょっと違うもの作ってみたいなと思って案2を採用。
横長、一直線でなんかうまい具合にステージを作りたい。
ハーメルンのSFCのゲームみたいなやつだよ。たのむ、わかってくれ。
と思ったけど、普通にマリオだよな。
5.霊魂はなぜ爆発するのか
投げなければならない理由を作るために、
「爆発する時に投げないとダメージを受ける」ということにします。光って点滅している間に投げよう! みたいな。いいぞ、ゲームみたいだ。
点滅する仕組みとか作るのめんどくさそう。すでに心はめんどくさがっている。
6.どんな素材が必要なのか
あほげーの時はとにかく最低限の絵を作ってあとから追加で作るんですが、
今回はブログに書くんだし、リスト作ってみるかと思っ……えええ……自分でリストアップしておきながらなんですけれどもめっちゃ量ないですか?
このめんどくさがり屋にこんな量が作れるのか……
とはいっても、
この中でゲームを作り始めるのに必要なのは……
ふふ、お客さん、ここだけの話なんですが、実は一つも要らないんですよ……。
でも、主人公、霊、床の三つの矩形があれば後で楽な気がするので、その三つだけ先に作ってからゲームを作り始めようと思います。
ここまで1時間くらいです。あと4日もあるんだよ、楽勝だよね!(油断)
7.とりあえずの絵
よくわかんないけど40分かけて主人公と霊と床を作りました。
矩形のつもりだったんだけど霊を描いたら主人公も描かなきゃいけない気がしてきてこんなことになってしまった。
これでなんとか……ということで……。あとはこれをUnityで動かしたりなんだりするのです。
うぅ……終わるんかいな。
今日は本当にこれだけしか作業してないです。
明日に続きます。
三└(┐卍`o´)卍ドゥルドゥル したい
吾「最近のCSSって、アニメーションとかできるんでしょ?
三└(┐卍^o^)卍ドゥルルルルルルの腕を本当に回したりできるんかな」
夫「面白そうなのでやってみます」
などと夕飯の買い出しの時に話をしていたら、
1時間くらいウンウン唸ったのちに、
slackにソースが送られてきました。
ソースかよ!!!!!
腕を回しながら左から右へピューーーーンしていくので、
三└(┐卍`o´)卍
卍(`o´卍┌)┘三
往復するように改造したりしてみました。
三└(┐卍`o´)卍
卍(`o´卍┌)┘三
neoaco.com
セリフをしゃべらせることもできます
neoaco.com
ウィンドウの横幅があんまり広くない方がいいかも。
CSSのanimatin の keyframeとかいう機能で作ってあります。
こんなんあるんだ。CSSだけでアニメーションできるのすげえ。
web1.0で知識が止まっているので、大変勉強になりました。
追記:2019.03.12
URLを変更していたので修正しました
Unity1week(お題:当てる)に参加しました
いちおうUnityでゲーム作ってる身としては参加したいよね、(参加自体は)ハードル低いし。
ということで、私が参加するのは今回で三回目です。
投稿したゲームはこちら
音が出るので音量をアゲ☝アゲ☝でお願いします
カチカチ相撲 | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
日記
どんな雰囲気でゲーム作ったかというご紹介。
一週間もあると、余裕があっていいですな。