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.さっきテストプレイしたら何か問題があった気がするけど思い出せない
おいおい、めっちゃりょうあるやんけ!
フェス出来るかな……
明日は最終日なんですがスプラトゥーンしたいです。
あっまちがえた、明日もがんばります。