マウスドラッグでハンドルを回転させて、ゲートを開閉してみます。
前の記事のバルブを回す処理をバルブにつけるスクリプトで行います。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ValveScript : MonoBehaviour
{
[SerializeField] Text text01;
[SerializeField] float limitMax = 10f;
[SerializeField] float limitMin = 0f;
HingeJoint hj;
JointLimits jl;
Vector3 mPos;
Vector3 screenSizeHalf;
float previousRad;
float valveSpeed = 1f;
Rigidbody rb;
float tan;
bool awake = false;
public Rigidbody gateRb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent();
rb.maxAngularVelocity = Mathf.Infinity;
hj = GetComponent();
}
public void Activate(bool b)
{
if (b)
{
screenSizeHalf.x = Screen.width / 2f;
screenSizeHalf.y = Screen.height / 2f;
screenSizeHalf.z = 0f;
mPos = Input.mousePosition - screenSizeHalf;
previousRad = Mathf.Atan2(mPos.x, mPos.y);
awake = true;
}
else
awake = false;
}
// Update is called once per frame
void Update()
{
if (awake)
{
mPos = Input.mousePosition - screenSizeHalf;
float rad = Mathf.Atan2(mPos.x, mPos.y); // 上向きとマウス位置のなす角
float dRad = rad - previousRad; // 前のフレームの角度との差
float t = Mathf.Tan(dRad);
// 角度の変化が小さい時
if (Mathf.Abs(t) * Time.deltaTime <= 0.009f)
{
tan += t;
if (tan < limitMax && tan > limitMin)
{
gateRb.AddForce(Vector3.up * t, ForceMode.Impulse);
rb.AddTorque(transform.TransformDirection(new Vector3(0f, t, 0f)), ForceMode.Impulse);
}
else if (tan <= limitMin)
{
tan = limitMin;
}
else if (tan >= limitMax)
{
tan = limitMax;
}
}
previousRad = rad; // 今のフレームの角度を保存
//text01.text = hj.angle + " " + tan + " " + t + " " + dRad;
}
}
}
プレイヤーがハンドルを左クリックするとプレイヤーに付けたスクリプトによってハンドルが活性化してハンドルを回転させるための計算を始めるようにしました。左クリックを離すと計算をやめます。
マウスの動きが早すぎると不安定になって、ゲートの移動範囲がずれてしまうので、速度制限を付けています。それでもまだ少しずれるので修正が必要です。
HingeJoint.angleは-180 ~ 180の範囲に固定されているので、マウスの移動分の角度のタンジェントを積み重ねて、その値によってハンドルの回転量に制限を付けています。
ゲートにはConfiguration Configurable Jointを付けてY軸方向にしか動かないようにしています。