#はじめに
Unityで箸の回転をプレイヤーにさせようと試行錯誤していた時に友人からHingeの存在について教えてくれたので
備忘録として軽くまとめようと思います。
自分なりの認識をまとめたメモとして記述しているので、間違いがあったら教えて頂けると幸いです。
#Jointとは
Rigidbody属性を持つオブジェクト同士を繋ぐものであり、各Jointによって特徴的な挙動を見せる。
つまりRigidbody属性を用いることで発生する重力やコライダーとの接触判定、摩擦に気を付ける必要がある。
#各Joint
・参考
https://unity-guide.moon-bear.com/joint/
###SpringJoint
バネで繋がったような動きをするジョイントのこと。
###FixedJoint
オブジェクト間を固定して繋ぐジョイントのこと。
親子関係を結んだオブジェクト同士のような動きをする
###HingeJoint
ある軸を基準に回転するような繋がり方をするJointのこと。
留め具のような役割を果たすのでドアやシーソーの軸に用いることができる。
今回はこのHingeJointを用いた。
#HingeJointとは
Hinge Joint は、2 つの リジッドボディ をグループ化し、互いにヒンジで連結されているかのように制約します。ドアに最適ですが、鎖や振り子などをモデル化するのにも使用できます。
https://docs.unity3d.com/ja/2018.4/Manual/class-HingeJoint.html
とUnityDocumentationに記述されている通り、関節のような役割を担う。今回主に用いたプロパティは以下の通り
- ConnectedBody 接続するオブジェクトの指定
- Anchor 支点とする軸の座標を指定
- Axis 回転軸の"向き"の指定
- UseSpring ConnectedBodyに指定したオブジェクトに対して特定の角度に到達させる
- Spring UseSpringを使用した際に使われるプロパティー
- Spring オブジェクトを特定の位置に移動させるための力
- Damper 摩擦度係数のようなもの。大きくなればなるほどオブジェクトの移動は遅くなる。つまり重力などの力も受けにくくなる。
- Target Position 回転させる角度の指定。Springの値に依存する。
- UseMotor オブジェクトを回転させるもの UseSpringとは挙動が異なる?
実際のコードとその挙動
今回はUseSpringを用いて挙動の制御を行おうとした。
コードの書き方は以下の記事を参照した。
https://docs.unity3d.com/ja/2019.4/ScriptReference/HingeJoint-spring.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HingeRotation : MonoBehaviour
{
private bool TriggerCheck = false;
HingeJoint joint;
JointSpring hingeSpring;
// Start is called before the first frame update
void Start()
{
joint = GetComponent<HingeJoint>();
hingeSpring = joint.spring;
hingeSpring.spring = 2000; //力の大きさ
hingeSpring.damper = 0; // 大きいほど速度が落ちる(摩擦?)
hingeSpring.targetPosition = 0; // 目的の角度
joint.spring = hingeSpring; // 上記三つをjointに渡す
joint.useSpring = true;
}
// Update is called once per frame
void Update()
{
bool leftClick = Input.GetMouseButton(0);
if (leftClick == true) // 左クリックしている間はオブジェクトに接触しない限りは回転を続ける
{
if (this.TriggerCheck == false) // コライダーに接触判定がなかった場合に回転動作をする
{
hingeSpring.targetPosition = -6.5f; // 閉じる
joint.spring = hingeSpring;
joint.useSpring = true;
}
else
{
hingeSpring.targetPosition = 0; // 初期状態に戻ろうとする
joint.spring = hingeSpring;
joint.useSpring = true;
}
}
else
{
hingeSpring.targetPosition = 0;
joint.spring = hingeSpring;
joint.useSpring = true;
}
this.TriggerCheck = false;
}
private void OnCollisionEnter(Collision other) // 接触した際に呼び出す?
{
this.TriggerCheck = true;
}
}
実際に動かすとこんな感じ。また、箸の根本にAnchorの座標を設置している。
#最後に
とりあえずまとめてみましたが認識として大分甘いので、今後更新するかもしれません。
HingeJointとUseSpringを教えてくれた友人に感謝。