ただ回るだけでルーレットとは片腹痛いっすね。ということでここではルーレット自体の制御を行ってみたいと思います。ルーレットのプロジェクトをまだ作っていない方は前回の記事を参考に作成してみてください。
回転開始部分の実装
現在はアプリを動かしたら勝手に動き出すので、なにかプログラムできっかけを与えたいと思います。ここでは左クリックで回転開始する処理を実装!
スクリプト更新
追加される内容としては以下。開始時に停止した状態から始めたいのでStartメソッドで初期化処理を追加します。
- 左クリックで回転始動
- 回転するスピードを設定出来る
- 現在の回転スピードを別の変数で用意する
using UnityEngine;
public class RouletteBoard : MonoBehaviour
{
public float currentSpeed = 0.0f;
public float maxSpeed = 100.0f;
private void Start()
{
currentSpeed = 0.0f;
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
currentSpeed = maxSpeed;
}
float updateRotationSpeed = currentSpeed * Time.deltaTime;
transform.Rotate(0, 0, updateRotationSpeed);
}
}
動かしてみて確認
スクリプトが更新されたら動かして確認してみましょう!すでにアタッチ済みのスクリプトの場合はそのまま動作確認が出来ます!
- 動画起動直後は回転しない
- 左クリックをすると回転する
- 回転速度はmaxSpeedに設定してある数値
- 速度を変えたい場合はインスペクターで数値を変更して左クリックを押すと更新されます
勝手に停止する処理
回転するようになったら次は止めましょう!止めるだけの処理はサクッと終わります。
使う技術
技術というほどではないですが、現在の速度を徐々に落としていく処理は、次のようなものを利用します。
現在のスピード *= 0.9f;
これは、[現在のスピード]に0.9かけた値を[現在のスピード]に再代入する処理です。1ループごとに0.9倍されていくわけですね。deltaTimeを気にするのであれば他の方法が良いのですが、お手軽なので今回はこちらで!
スクリプト変更
変更内容はざっくり以下
- ブレーキの力を追加
- ブレーキの力になぜcurrent(現在の)がついているかはこの後分かります!
- 毎フレームブレーキがかかる
- 一定速度以下になったらストップする
- 今回は0.01をしきい値にしています
using UnityEngine;
public class RouletteBoard : MonoBehaviour
{
public float currentSpeed = 0.0f;
public float maxSpeed = 100.0f;
public float currentBrakePower = 0.9f;
private void Start()
{
currentSpeed = 0.0f;
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
currentSpeed = maxSpeed;
}
currentSpeed *= currentBrakePower;
if (currentSpeed < 0.01f)
{
currentSpeed = 0;
}
float updateRotationSpeed = currentSpeed * Time.deltaTime;
transform.Rotate(0, 0, updateRotationSpeed);
}
}
動かして確認
ゲームを動かして左クリックすると回転し始めるけど、すぐ止まろうとする。このようになっていれば成功です。
止まるのが早すぎんか?と思うので次の項目でついでにブレーキの強さも調整しますね
任意のタイミングで停止させる
まぁ普通のルーレットゲームであれば、回転中から停止依頼をして止めることが多いと思います。ということで今回の締めとして、停止の開始を追加してみましょう。
実装方針
任意のタイミングで停止するためには、次のような要素を実装します
- 左クリックで回転開始するタイミングでブレーキの力を無効化する
- 右クリックをきっかけに停止を開始
- 現在のブレーキの力を停止するための力に変化させる
現在の実装内容だとブレーキのちからを無効化するには1にすることです。1だと前のフレームと回転スピードが変化しないため、ブレーキが効いてないことになります。
あとは右クリックで停止依頼がされたタイミングで今回のブレーキの力に上書きすることで停止が開始されます。
停止が開始されるって表現、ちょっと違和感ありますけど慣れてね
スクリプト更新
変更後の全スクリプトは以下の様になります。
using UnityEngine;
public class RouletteBoard : MonoBehaviour
{
public float currentSpeed = 0.0f;
public float maxSpeed = 100.0f;
public float currentBrakePower = 1.0f;
public float maxBrakePower = 0.99f;
private void Start()
{
currentSpeed = 0.0f;
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
currentSpeed = maxSpeed;
currentBrakePower = 1.0f;
}
if (Input.GetMouseButtonDown(1))
{
currentBrakePower = maxBrakePower;
}
currentSpeed *= currentBrakePower;
if (currentSpeed < 0.01f)
{
currentSpeed = 0;
}
float updateRotationSpeed = currentSpeed * Time.deltaTime;
transform.Rotate(0, 0, updateRotationSpeed);
}
}
動かしてみる
撮影環境の影響で少しパラメータ変えているので皆さんの環境と若干挙動が変わっているかもしれません。ブレーキはFPSの影響をかなり受けるので、扱いにはご注意ください。
次回!どこに止まったか判定処理を入れる
やっとルーレットらしくなってきましたが、プレイヤーの目視で判断する以外にないじょうたいですので、次回ではプログラムで判断させましょう!
次回に行う内容
- ルーレットの針を追加
- 止まった場所を判定するプログラムを追加
- テキスト(TMP)で表現
今回作ったものの追加課題
こちらは対応しなくても大丈夫ですが、余力がある人は考えてみましょう
- ブレーキをもっとすべらせたり、効きを強くするには値をどう変化させればよいか
- FPSに依存しないようにブレーキをかける方法
コメント
コメント一覧 (1件)
[…] ルーレットの制御処理を追加!回転の開始・停止処理part02 […]