おすすめ!自作ゲーム!

【サマーセール参戦】夏休みは『バイサバ』を遊び尽くせ!今だけ驚異の【50%OFF】で爆速サバライフを始めよう!

イメージ
ついに待ちに待った夏休みが到来! まとまった休みのお供に、熱中できるゲームを探していませんか? そんなあなたに超ビッグニュースです! 手軽なのに奥が深い、中毒者続出中の超爽快防衛アクション『バイサバ』が、なんとサマーセールに電撃参戦! 過去最大級のお得なチャンスを見逃すな! 🔥 衝撃の「50%OFF」!今が一番始めどき! 今回のサマーセール期間中、『バイサバ』は驚愕の【50%OFF(半額)】でお買い求めいただけます! ワンコイン感覚でポチれるこの価格は、まさに破格。 「気になっていたけど、まだ触れていなかった」「友達に勧められて迷っていた」という方は、 ぶっちゃけ今買わない理由がありません! 🎮 そもそも『バイサバ』ってどんなゲーム? 「安くなってるのは分かったけど、どんなゲームなの?」という方のために、本作の魅力を3つのポイントでサクッとご紹介します! 操作は超カンタン「左右移動」だけ! 基本の攻撃はすべてオート(自動)。ゲーム初心者でも、キーボードを左右に動かすだけで、バシバシ敵を倒せる圧倒的お手軽さ! 右クリック長押しの「チャージ攻撃」が爽快すぎる! ここぞという時に放つチャージ攻撃は、威力も範囲もHit数もすべてが「倍!バイ!Bye!」。画面を埋め尽くすスライムや邪魔な岩を一瞬で吹き飛ばす快感は、一度味わうと病みつきです! 奥深い「ビルド構築」と「サポート必殺技」! ただ火力を上げるだけでは通用しない特殊なステージも多数存在。様々なアイテムを組み合わせた自分だけの「ビルド」と、キャラごとの「超強力な必殺技」で難関を突破する戦略性もバツグンです! ☀️ 夏休みは『バイサバ』で「時間泥棒」されちゃおう! 手軽に5分だけ遊ぶも良し、コイン稼ぎステージを周回してガッツリ金策に励むも良し。気づけば「え、もうこんな時間!?」となること間違いなしの、最強の“時間泥棒”ゲームです。 クリスタルをお弁当で癒やしながら、お空の彼方に吹っ飛ぶ(ゲームオーバー)恐怖のボスを撃破し、この夏一番の爽快感を体験してみませんか? 📝 セール情報まとめ セール内容: 『バイサバ』本体が 50%OFF(半額) 開催期間: [~9月14日まで] ぜひこのお得な機会に『バイサバ』を手に入れて、最高の夏休みにしてくださいね!ステージでお待ちしています! Bye!Bye!Survivo...

【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」でいいんじゃない?

Unityで子オブジェクトをすべて取得したり、1つだったり

このブログについて