おすすめ!自作ゲーム!

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

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

【Unity】AddForceを使った予測軌道【ピペット制作記録3】





作成中のゲーム「ぴぺっと」では
ジャンプするときの軌道が大事になります。


これを直観のみで行うと、
何度もミスして嫌気がさします(体験談)


ジャンプの弾道を予測軌道を表示したかった!

もう最初から軌跡を表示しよう!


なので、
  1. 軌跡を先に表示し、
  2. タイミングを見計らって、
  3. ジャンプ!
という仕様にしました。



※ 目標画像


次の土管に狙いを定めとジャンプします。

※ 実際の画像



かなりいい感じにできましたー(/・ω・)/


// 疑似コード


「鉛直投げ上げの公式」を使えばOK!


これです↓




…いえ、ぶっちゃけよくわからなかったので、
サイト巡りをしたら見つけました。

→ 【Unity勇者の奮闘記】Unityで物理の勉強3(弾道予測線を作成する)


まさにこれでOKでした。

こういうプログラムを思いつかないのが、
初心者にはつらい( ;∀;)


// 実際のプログラム


私の場合は2Dにしたかったので、
Rigidbody2Dに変更しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class DrawLine : MonoBehaviour {
 
 // 弾道を表示するための点のプレハブ
 [SerializeField] private GameObject dummyObjPref = default;

 // 弾道を表示する点の親オブジェクト
 [SerializeField] private Transform dummyObjParent = default;

 // 初速のベクトル
 [SerializeField] private Vector3 v0 = default;

 // 弾道予測の点の数
 [SerializeField] private int dummyCount = 10;

 // 弾道を表示する間隔の秒数
 [SerializeField] private float secInterval = 0.2f;

 private List<GameObject> dummySphereList = new List<GameObject>();
 private Rigidbody2D rigid = default;

 private bool drow = true;

 void Start()
 {
  rigid = GetComponent<Rigidbody2D>();
  if (!rigid) rigid = gameObject.AddComponent<Rigidbody2D>();
  rigid.isKinematic = true;
  
  dummyObjParent.transform.position = transform.position;

  // 弾道予測を表示するための点を生成
  for (int i = 0; i < dummyCount; i++)
  {
   var obj = (GameObject)Instantiate(dummyObjPref, dummyObjParent);
   dummySphereList.Add(obj);
  }
 }

 void Update()
 {
  if (!drow) return;

  // 弾道予測の位置に点を移動
  for (int i = 0; i < dummyCount; i++)
  {
   var t = i * secInterval;
   var x = t * v0.x;
   var z = t * v0.z;
   var y = (v0.y * t) - 0.5f * (-Physics.gravity.y) * Mathf.Pow(t, 2.0f);
   dummySphereList[i].transform.localPosition = new Vector3(x, y, z);
  }

  // マウスクリックで球の弾道を確認
  if (Input.GetMouseButtonDown(0))
  {
   drow = false;
   rigid.isKinematic = false;
  }
 }

 /// <summary>
 /// プレイヤーから送られてくる
 /// 移動方向と、パワーをかけたもの
 /// rigidbody2d.AddForce() と同じ
 /// </summary>
 public void Set(Vector3 v3)
 {
  v0 = v3;
 }
}

 
■ プレイヤーのプログラムも改良


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

public class Player : MonoBehaviour
{
 [SerializeField] private DrawLine dLine = default; // 予測軌道を表示
 private UI ui = default;
 private Rigidbody2D rigidbody2d = default; // これがないと
 private float jumpPower = 1;    // ジャンプのパワー
 private float power = 10;     // 全体のパワー
 private float upDownSpeed = 0.5f;   // ジャンプ力の上げ下げ

 // 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);
  // 予測軌道
  dLine.Set(new Vector3(0.25f, jumpPower) * power);

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

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


前回のプログラムに
dLine.Set(new Vector3(0.25f, jumpPower) * power);
の項目を追加。


ジャンプするときのAddForceの部分、
rigidbody2d.AddForce(new Vector3(0.25f, jumpPower) * power, ForceMode2D.Impulse);
と、全く同じですね。



LineBallは、当たり判定なしのスプライトのプレハブです。
軌道を示す黒い点です。これは任意でOKです。


■ まとめ


先人の知恵、様様でした!
ここから学んで自分の成長につなげたい。


■ 参考にしたHP

このブログの人気の投稿

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

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

このブログについて