おすすめ!自作ゲーム!

【バイサバ!】溜めて、狙って、ぶっ飛ばせ!チャージで全て薙ぎ払うタワーディフェンス!

イメージ
バイサバをBOOTHでも販売開始しました! サーマーセールも合わせて開催! 今なら 50%OFF! の 500円で購入可能 に! ダウンロードは →  https://yamatogamelabs.booth.pm/items/8407425   DLsiteで販売しています。(Bloggerの規約上、リンクは貼れません。 Bye!Bye!Survivor!  もしくは  RJ01621439  で検索してください) デモ版もあるのでまずはお試しから! ■ ゲーム概要 溜めて、狙って、ぶっ飛ばせ! 右クリック長押しでチャージ! 溜めるほど、攻撃がどんどんパワーアップ! 攻撃力・攻撃サイズ・Hit数・クリティカルまで強化される、強力なチャージ攻撃で、押し寄せるスライムをまとめて吹き飛ばそう! 敵をピンポイントで狙い撃つか、 最大までチャージして敵の群れを一気に薙ぎ払うか。 シンプルな操作で、チャージのタイミングと狙いが勝敗を分ける! チャージ攻撃で敵をまとめて撃破! ■ このゲームの魅力 シンプルな操作で、チャージのタイミングと狙いが勝敗を分ける! チャージ攻撃で敵をまとめて撃破! 基本操作は左右移動だけ。 攻撃は自動で行われるので、難しい操作は必要ありません。 そこに加わるのが、強力なチャージ攻撃。 チャージするほど攻撃が強くなり、 大きさやHit数も増加! 大量の敵をまとめて貫通させたり、 強力な一撃で狙った敵を撃ち抜いたり。 いつ撃つか、どこを狙うかはあなた次第! ■ クリスタルを守り抜け! スライムたちは、あなたではなくクリスタルを狙って押し寄せてきます。 敵がクリスタルに到達するとダメージを受け、 HPが0になるとクリスタルが大爆発! そのまま空の彼方へ吹き飛ばされてゲームオーバー! 攻撃だけでなく、クリスタルのHP管理も重要です。 ボスを倒してステージを突破! ステージの最後には強力なボスが登場。 大量のHPを持ち、強力な攻撃を繰り出してきます。 さらに、ボスがクリスタルに到達すると即ゲームオーバー! 敵の攻撃は、こちらの攻撃で相殺することも可能。 迫りくる敵と弾をまとめて薙ぎ払い、 ボスがクリスタルへ到達する前に撃破しよう! ■ オブ...

【Unity】Addforce2Dでジャンプアクション!【ぴぺっと制作記録2】


キャラクターの基本動作とUIを作成しています。





今回の作業の内容は以下の通りです。

  •  キャラクターを飛ばす
  •  キャラクターのジャンプ力を調整できるように
  •  キャラクターのパワーUIを表示



ジャンプして進んでいくゲームなので、必須の項目。
さらに、ジャンプ力を調整する仕様。
それをUIで分かりやすく表示することを考えています。




// 頭の中のイメージ



こんな感じに



// 実際に動かしてみたとき




ジャンプしたらUIを非表示にするのを忘れてました(;^_^A
後で追加しておきます。


でも、キャラの右側にUIを表示するのもできています。
もちろん、ゲージの量に応じてジャンプ力は変わります。


// 疑似コード

プログラムで書くときにできるだけ、
頭の中のイメージを文字でまとめておきます。


キャラを飛ばすプログラム

  1. マウスをクリック
  2. キャラに力を加えて移動させる
  3. ↑の時に重力を忘れずに
  4. 飛んでいく

ジャンプ力の調整

  1. 変数を作って、
  2. Mathf.PingPongを使えばOK

ジャンプ力のゲージUI

  1. ゲージの画像を取得
  2. fillAmountに値を入れる

ゲージの位置をプレイヤーの横に

  1. プレイヤーの位置を取得
  2. ワールド座標をスクリーン座標に変換
  3. ゲージオブジェクトに位置を設定


// 実際のプログラム


プログラムはこちらになります。
プレイヤーのプログラムとUIの2つがあります。

プレイヤーのプログラム


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
 private UI ui = default;
 private Rigidbody2D rigidbody2d = default; // これがないと
 private float jumpPower = 1;    // ジャンプのパワー
 private float power = 10;     // 全体のパワー
 private float upDownSpeed = 0.7f;    // ジャンプ力の上げ下げ

 // Start is called before the first frame update
 void Start()
 {
  ui = GameObject.Find("GM").GetComponent<UI>();
  rigidbody2d = GetComponent<Rigidbody2D>();
 }

 // Update is called once per frame
 void Update()
 {
  // UI
  ui.PowerGage(jumpPower);
  ui.GagePosition(this.transform);

  // ジャンプ力を上げ下げ
  jumpPower = Mathf.PingPong(upDownSpeed * Time.time, 1);

  // マウスクリック
  if (Input.GetMouseButtonDown(0))
  {
   // 重力を戻す
   rigidbody2d.gravityScale = 1;
   // パワーに応じてジャンプ
   rigidbody2d.AddForce(new Vector3(0.25f, jumpPower) * power, ForceMode2D.Impulse);
  }
 }
}

ジャンプしているのは↓
rigidbody2d.AddForce(new Vector3(0.25f, jumpPower) * power);
AddForceを使っています。


移動方向は右へ移動していくので、固定。
もしかしたら、反対へ進むことが出てきたら、
さらに改良するかもです。


Mathf.PingPongは指定した時間で、
指定した値行き来してくれるやつです。


これが欲しかった!便利!
public static float PingPong (float t, float length);
→ Unityのドキュメント


lengthの値を、tの時間で行き来します。


jumpPower = Mathf.PingPong(upDownSpeed * Time.time, 1);
の場合は、0~1の値を「upDownSpeed * Time.time」の時間で行き来します。


upDownSpeedはゲームの状況に応じて、
速くしたり遅くしたりしようと思っているので、 使っています。


UIのプログラム 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UI : MonoBehaviour
{
 // タイマーを表示するテキスト
 [SerializeField] private Text timerText = default;
 /// <summary>
 /// タイマー更新用
 /// </summary>
 public void Timer(int num)
 {
  // タイマーをテキストで表示
  timerText.text = num.ToString();
 }

 // ゲージのUI
 [SerializeField] private Image powerGage = default;
 /// <summary>
 /// パワーゲージ
 /// </summary>
 public void PowerGage(float num)
 {
  // ゲージを更新
  powerGage.fillAmount = num;
  // 色を変える
  // オレンジ
  if (num > 0.8f)   powerGage.color = new Color(1, 0.45f, 0, 1);
  // 緑
  else if (num > 0.4f) powerGage.color = new Color(0, 1, 0.2f, 1);
  // 青
  else     powerGage.color = new Color(0, 0.75f, 1, 1);
 }

 // パワーゲージの親オブジェクト
 [SerializeField] private RectTransform GagePar = default;
 /// <summary>
 /// パワーゲージの位置を決める
 /// プレイヤーの少し右に
 /// </summary>
 public void GagePosition(Transform p)
 {
  // UIなので、変換する必要がある
  GagePar.position = 
   RectTransformUtility.WorldToScreenPoint(Camera.main, p.position + new Vector3(1f, 0.5f));
 }
}


前回のタイマーの記事のプログラムがありますが、
お気になさらずに。


ジャンプ力に応じて、
色を変えるプログラムも追加してあります。

このブログの人気の投稿

「Unity」地面との当たり判定は、「ContactFilter2D」でいいんじゃない?

【バイサバ!】溜めて、狙って、ぶっ飛ばせ!チャージで全て薙ぎ払うタワーディフェンス!

このブログについて