RigidBodyを使ったプレイヤーの動き、手早く作ると多分これが一番早いと思います。
Rigidbody2D rb = GetComponent<Rigidbody2D>();
if (rb)
{
float hori = Input.GetAxis("Horizontal");
float speed = 5.0f;
rb.velocity = new Vector2(hori * speed, m_rb.velocity.y);
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary> 移動</summary>
[RequireComponent(typeof(Rigidbody2D))]
public class SampleMove : MonoBehaviour
{
//-----------------------------------------------------------------------
// 変数
//-----------------------------------------------------------------------
/// <summary>
/// 移動スピード
/// </summary>
[SerializeField]
[Min(0.0f)]
private float m_speed = 10.0f;
/// <summary>
/// リジッドボディ
/// </summary>
private Rigidbody2D m_rb = null;
/// <summary>
/// 入力
/// </summary>
private Vector2 m_inputMove = Vector2.zero;
//-----------------------------------------------------------------------
// MonoBehaviour継承
//-----------------------------------------------------------------------
/// <summary>
/// 初期化処理
/// </summary>
private void Start()
{
m_rb = GetComponent<Rigidbody2D>();
}
/// <summary>
/// 更新処理
/// </summary>
private void Update()
{
// 移動入力
float hori = Input.GetAxis("Horizontal");
m_inputMove = new Vector2(hori, 0.0f);
}
/// <summary>
/// 更新処理
/// </summary>
private void FixedUpdate()
{
m_rb.velocity = new Vector2(m_inputMove.x * speed, m_rb.velocity.y);
}
}
ただ、この処理だと加速減速がありません。
ゲームのキャラクターの最高速までの動きはすぐに到達してほしい。
そして、ボタンを離したらいい感じに減速してほしい。
ゲームとしてちゃんとした移動を作りたい…と思って調べたら
分かりやすい解説動画がありました。
youtu.be
ありがたいことに、ソースコードも配布されているので
解析して自分なりに調べてみました。
github.com
解析
プレイヤーの移動についての処理部分のみを抜き取るとこのような形です。
加速率の(1.0f/Time.fixedDeltaTime)
の部分は50というマジックナンバーでしたが
Unityの物理処理はFixedUpdate()
で行われており
合わせるために50にしたのではないかな~…と思います。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary> 移動</summary>
[RequireComponent(typeof(Rigidbody2D))]
public class RigidMove : MonoBehaviour
{
//-----------------------------------------------------------------------
// 変数
//-----------------------------------------------------------------------
/// <summary>
/// 最高速度
/// </summary>
[SerializeField]
[Min(0.0f)]
private float m_maxSpeed = 10.0f;
/// <summary>
/// 加速度
/// </summary>
[SerializeField]
[Min(0.0f)]
private float m_acceleration = 10.0f;
/// <summary>
/// リジッドボディ
/// </summary>
private Rigidbody2D m_rb = null;
/// <summary>
/// 入力
/// </summary>
private Vector2 m_inputMove = Vector2.zero;
//-----------------------------------------------------------------------
// MonoBehaviour継承
//-----------------------------------------------------------------------
/// <summary>
/// 初期化処理
/// </summary>
private void Start()
{
m_rb = GetComponent<Rigidbody2D>();
}
/// <summary>
/// 更新処理
/// </summary>
private void Update()
{
// 移動入力
float hori = Input.GetAxis("Horizontal");
m_inputMove = new Vector2(hori, 0.0f);
}
/// <summary>
/// 更新処理
/// </summary>
private void FixedUpdate()
{
float leapAmount = 1.0f;
// 目標速度の計算
float targetSpeed = m_inputMove.x * m_maxSpeed;
targetSpeed = Mathf.Lerp(m_rb.velocity.x, targetSpeed, leapAmount);
// 加速率の計算
float accelRate = (m_acceleration / m_maxSpeed) * (1.0f / Time.fixedDeltaTime)
// 移動
float speedDif = targetSpeed - m_rb.velocity.x;
float movement = speedDif * accelRate;
m_rb.AddForce(Vector2.right * movement, ForceMode2D.Force);
}
}
良い感じの動きを作ることが出来ました。
他人が作ったコードを参考にして自分のソースコードに翻訳して取り入れてみました。
自分で一つ一つ手元で計算しながら取り入れていくと理解がしやすい!
海外の方なので関数名・変数名も参考になります。
この人は移動をRun、ダッシュをDashという風に切り分けていました。
私なら雑にMoveとかにしてた。
参考資料
・Improve your Platformer with Acceleration | Examples in Unity - YouTube
・GitHub - DawnosaurDev/platformer-movement