滑らかな動作でゲームの質って上がるような気がしますよね。
最近開発中のゲームに滑らかな回転を実装したくなったので
作り方を調べていたらこんな記事が
移動・回転・拡縮がスムーズなだけで、クオリティが上がった気がする話 - Qiita
#瞬間移動例えば、「左クリックする毎に赤いキューブをy軸で45度回したい」「右クリックする毎に赤いキューブと青いキューブの場所が入れ替わる」これを文章見たまま実装すると、using Uni…
自分で滑らかな動作ができるコンポーネントを作るとはすごいとしか言えません…
滑らかな回転を実装
こちらがその滑らかな動作を可能にするコンポーネント
using UnityEngine;
namespace SmoothigTransform
{
public class SmoothTransform : MonoBehaviour
{
public Vector3 TargetPosition;
public Vector3 TargetScale;
public Quaternion TargetRotation;
public float TimeFact { set; get; } = 0.15f;
public void Start()
{
TargetPosition = transform.localPosition;
TargetScale = transform.localScale;
TargetRotation = transform.localRotation;
}
public void Update()
{
var t = 1 - Mathf.Pow(0.1f, Time.deltaTime / TimeFact); //TimeFact秒で今いる場所から1/10まで間を詰めるための値
transform.localPosition = Vector3.Lerp(transform.localPosition, TargetPosition, t);
transform.localScale = Vector3.Lerp(transform.localScale, TargetScale, t);
transform.localRotation = Quaternion.Lerp(transform.localRotation, TargetRotation, t);
}
}
}
動作の速さを変えたいときは「TimeFact」の値を変えればok
public float TimeFact { set; get; } = 0.15f;
このスクリプトを滑らかな動きをしてほしいゲームオブジェクトにアタッチ
次に、回転をするためのスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SmoothigTransform;
public class Player : MonoBehaviour
{
[SerializeField] SmoothTransform player;
void Update()
{
PlayerRotate();
}
private void PlayerRotate()
{
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
player.TargetRotation *= Quaternion.Euler(0, 0, 90);
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
player.TargetRotation *= Quaternion.Euler(0, 0, -90);
}
}
}
これも回転させたいゲームオブジェクトにアタッチ
スムーズな動作を可能にするスクリプトを取得するための項目があるのでそのスクリプトを持っているオブジェクトを入れましょう。
これで実行してみると
滑らかな回転ができました!
まとめ
滑らかなだけで見てて気持ちいいですね。
コメント