キャラクターの基本動作とUIを作成しています。
今回の作業の内容は以下の通りです。
- キャラクターを飛ばす
- キャラクターのジャンプ力を調整できるように
- キャラクターのパワーUIを表示
ジャンプして進んでいくゲームなので、必須の項目。
さらに、ジャンプ力を調整する仕様。
それをUIで分かりやすく表示することを考えています。
// 頭の中のイメージ
こんな感じに
// 実際に動かしてみたとき
ジャンプしたらUIを非表示にするのを忘れてました(;^_^A
後で追加しておきます。
でも、キャラの右側にUIを表示するのもできています。
もちろん、ゲージの量に応じてジャンプ力は変わります。
// 疑似コード
プログラムで書くときにできるだけ、
頭の中のイメージを文字でまとめておきます。
キャラを飛ばすプログラム
- マウスをクリック
- キャラに力を加えて移動させる
- ↑の時に重力を忘れずに
- 飛んでいく
ジャンプ力の調整
- 変数を作って、
- Mathf.PingPongを使えばOK
ジャンプ力のゲージUI
- ゲージの画像を取得
- fillAmountに値を入れる
ゲージの位置をプレイヤーの横に
- プレイヤーの位置を取得
- ワールド座標をスクリーン座標に変換
- ゲージオブジェクトに位置を設定
// 実際のプログラム
プログラムはこちらになります。
プレイヤーのプログラムと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));
}
}
前回のタイマーの記事のプログラムがありますが、
お気になさらずに。
ジャンプ力に応じて、
色を変えるプログラムも追加してあります。