習作:アイテムのレイヤーをIgnoreRaycastに、敵キャラの瞬間移動アップデート、プレイヤーの点滅でダメージ表現、スタート→ステージ2つ→ゴールの流れ/1on1【184日目】(2019/01/28)
https://gyazo.com/f01033740f6cc28811efa6198f9ed5f8
Porin.icon今日はカラメルカラムの業務の作業記録だよん!
◆作業記録の目次
1. 振り返りと考え事たいむ:1on1
2. 習作:アイテムのレイヤーをIgnoreRaycastに、敵キャラの瞬間移動アップデート、プレイヤーの点滅でダメージ表現、スタート→ステージ2つ→ゴールの流れ
◆作業時間のタイムトラッキング結果
https://gyazo.com/d74cee314a66231e9850e8784ccf1e9a
https://gyazo.com/e3eaad8e1ffdce199c2d2eb5deef0231
https://gyazo.com/ea38e8d40023a4d62a667463b859b1d4
Carcol.iconここからはカラメルカラム 業務内でやったことの記録だよ! 1. 振り返りと考え事たいむ:1on1
◆前日の振り返り
▼ 前回の業務の作業記録
▼ 振り返り内容
自分の中でもっとコンセプトや世界設定が落とし込めるようにしないとなあ
今回はデザイン頼む時に、どんなデザインがいいか?の判断軸が曖昧になってしまった
「動きを実装する」ってことにばかり気を取られていて、そこらへんはぱぱっとやってしまってた
きっとデザインだけでなく、細かい動きとかゲームの流れにも影響してくると思われる
月の振り返りの際は、作業記録ごとの振り返り内容も参照するようにしよう
どうしても月終わりのことの方が記憶に残っているのでそれ中心になりがち
今まではタイトルだけをパラっと見て何をやったか?までは確認していた
けど、そのついでに各記録の冒頭にある振り返り部分も見ればだいぶ思い出せるのでは?
習作の締め切りをもう少し早めに確認すればよかった
締め切りが頭にあるだけで、作業の優先順位とか進め方がかなり変わる
習作初期の頃は探り探りだったけど、仕様とか考える際に締め切り確認した方がよかったなあと思う
習作では未知のことがたくさんあったけど、その分学べたこともたくさんあったのでよかった
「わ、わからん〜」ってなることによって考えるきっかけになったりとか
デザイン依頼も実際にやってみて、「このやり方だとよくなかったな〜」と振り返るきっかけになったり
実装考えてデザイン依頼して仕様考えてと、なんかいろんな筋肉を鍛えた感じがする
◆本日やりたいこと
/icons/done.iconエスBOT誤字修正反映
/icons/done.iconデザイン依頼
/icons/done.icon習作実装進める
/icons/done.icon1月の1on1
◆ 1on1
https://gyazo.com/ea38e8d40023a4d62a667463b859b1d4
2. 習作:アイテムのレイヤーをIgnoreRaycastに、敵キャラの瞬間移動アップデート、プレイヤーの点滅でダメージ表現、スタート→ステージ2つ→ゴールの流れ
◆ アイテムのレイヤーをIgnore Raycastに変える
こうしないとアイテムが間にあると敵から発見されなくなってしまったため
◆ 敵キャラの瞬間移動アップデート
スプライトレンダラーを非有効化することで消える→出現を表現
最初にゲームオブジェクトの非アクティブでやろうとしたら、そのままスクリプトコンポーネントも非アクティブになって止まってしまった...
code:EnemyController.cs
IEnumerator Teleportation()
{
yield return new WaitForSeconds(attackInterval);
// 消える
GetComponent<SpriteRenderer>().enabled = false;
// プレイヤーのそばに移動
findPos = DetermineFindPos();
MovePlayerSide();
yield return new WaitForSeconds(vanishSpeed);
// 現れる
GetComponent<SpriteRenderer>().enabled = true;
// 攻撃
StartCoroutine(Attack());
yield break;
}
◆ プレイヤーの点滅でダメージ表現
これもスプライトレンダラーを非有効化で表現
code:PlayerController.cs
public IEnumerator Die()
{
yield return new WaitForSeconds(1f);
for (int i=0; i<flashtimes; i++)
{
yield return new WaitForSeconds(flashSpeed);
GetComponent<SpriteRenderer>().enabled = false;
yield return new WaitForSeconds(flashSpeed);
GetComponent<SpriteRenderer>().enabled = true;
}
yield return new WaitForSeconds(1f);
Destroy(gameObject);
yield break;
}
◆ 最後にゲームオーバーを表示
code:EnemyController.cs
IEnumerator Attack()
{
// TODO 攻撃モーション
// プレイヤー消滅
StartCoroutine(playerController.Die());
// 消滅まで待機
yield return new WaitUntil(() => !player);
yield return new WaitForSeconds(1f);
// ゲームオーバー表示
stageDirector.ShowGameOver();
Debug.Log("game over");
// スタート画面へ移動
}
https://gyazo.com/e25f0fd82d9cc2057ae2eacb43dd8132
◆ ゴール判定仮実装
static変数を使用
以下のよういポイント状況をstaticで登録
ゲームシーンが始まる時には初期化をしている
code:ItemDirector.cs
public static POINTSTATE PointState { get; private set; }
あとはエンドシーン遷移後にポイント状況に応じた分岐を用意すればOK
code:EndDirector.cs
void Start () {
switch (ItemDirector.PointState)
{
case ItemDirector.POINTSTATE.GOOD:
Debug.Log("good");
break;
case ItemDirector.POINTSTATE.NORMAL:
Debug.Log("normal");
break;
case ItemDirector.POINTSTATE.BAD:
Debug.Log("bad");
break;
default:
Debug.Log("error");
break;
}
}
◆ スタート→ステージ2つ→ゴールの流れ
▼ 流れを作成
スタート画面→ゲームスタート
ゲームオーバー→スタート画面
ゲーム内でゴール→ゴール画面へ
▼ ステージ移動
ステージ状態を表す列挙型を作成
code:StageDirector.cs
public enum STAGESTATE
{
NONE = -1,
INSTAGE = 0,
MOVE
}
public STAGESTATE stageState;
ステージ移動時用のプレイヤーの動きを作成
code:PlayerController.cs
void FixedUpdate () {
// 基本動作
switch (stageDirector.stageState)
{
case StageDirector.STAGESTATE.INSTAGE:
// 徐々に右に動く
playerRigid.velocity = Vector2.right * slideSpeed;
break;
case StageDirector.STAGESTATE.MOVE:
// 移動
playerRigid.velocity = Vector2.right * stageMoveSpeed;
break;
case StageDirector.STAGESTATE.NONE:
playerRigid.velocity = Vector2.zero;
break;
}
}
移動中はカメラで追うように
code:CameraController.cs
void Start () {
stageDirector = FindObjectOfType<StageDirector>();
offsetX = transform.position.x - player.transform.position.x;
}
void Update () {
if(stageDirector.stageState == StageDirector.STAGESTATE.MOVE)
{
// TODO 入り出しが汚いので何かしらの処理をする
transform.position = new Vector3(player.transform.position.x + offsetX, transform.position.y, transform.position.z);
}
}
ステージ2の開始
判定方法悩んだけど今回はステージ2つまでにする予定だから簡易的に、ステージ2の開始位置に空のゲームオブジェクトを置いて、その位置にプレイヤーが到達したらステージ2を開始にした
ステージ状態がMOVEのときだけ発動しないと、ステージ2内で何度も呼び出してしまう
code:StageDirector.cs
private void FixedUpdate()
{
if(player && player.transform.position.x > stage2Checker.transform.position.x && stageState == STAGESTATE.MOVE)
{
StartCoroutine(StartStage2());
}
}
(了)
https://gyazo.com/ea38e8d40023a4d62a667463b859b1d4
感想や指摘などあったらどしどし連絡ください!!
もし万が一、気が向いたりして何かコメントをもらえたら超絶喜びます!!Porin.icon