LoginSignup
3
1

More than 1 year has passed since last update.

UnityのHingeJointについて自分なりの備忘録と使用例

Posted at

はじめに

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

HingeRotation.cs
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の座標を設置している。
chopsticks.gif

最後に

とりあえずまとめてみましたが認識として大分甘いので、今後更新するかもしれません。
HingeJointとUseSpringを教えてくれた友人に感謝。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1