LoginSignup
15
15

More than 5 years have passed since last update.

[Unity] ピンボールゲームのフリッパーを実装する

Posted at

ピンボールゲームを作る上で実装必須のフリッパー※ですが、意外とその実装方法が見つからなくて困りました。
※ボールを打つための「 \ / 」部分です。

思い描いていた動作がHingeJointを使うことで実現できたので、その方法をまとめておきます。

事前準備

まずはCubeを新規作成します。
TransformのScaleをX = 4にして少し横長にします。
transform.png

次に、このCubeにRigidbodyとHingeJointのComponentを追加します。
RigidbodyはUse Gravityのチェックを外します。
HingeJointはAnchorの位置を(0.5, 0, 0)に、Axisの向きを(0, 0, 1)に変更し、Use Springにチェックをつけます。
Rigidbody_HingeJoint.png

スクリプト

事前準備で作成したCubeに、以下のスクリプトを追加します。
追加後、Game画面上でマウスを左クリックするとフリッパーが動きます。

flipper.cs
using UnityEngine;
using System.Collections;

public class flipper : MonoBehaviour {

    public float spring = 40000;
    public float damper = 1000;
    public float openAngle = 45;
    public float closeAngle = -45;

    private HingeJoint hj;
    private Rigidbody rb;

    void Start () {
        hj = gameObject.GetComponent<HingeJoint>();
        hj.useSpring = true;
        rb = gameObject.GetComponent<Rigidbody>();
        rb.useGravity = false;
        closeFlipper ();
    }

    void Update () {

        if (Input.GetMouseButtonDown (0)) {
            openFlipper();
        }
        if (Input.GetMouseButtonUp (0)) {
            closeFlipper();
        }

    }

    public void openFlipper(){
        JointSpring spr = hj.spring;
        spr.spring = spring;
        spr.damper = damper;
        spr.targetPosition = openAngle;
        hj.spring = spr;
    }

    public void closeFlipper(){
        JointSpring spr = hj.spring;
        spr.spring = spring;
        spr.damper = damper;
        spr.targetPosition = closeAngle;
        hj.spring = spr;
    }

}

解説

    public float spring = 40000;
    public float damper = 1000;
    public float openAngle = 45;
    public float closeAngle = -45;

springはバネの強さで、これを大きくすると勢いよく動くようになります。
damperはバネの戻りにくさで、これを大きくするとあまりビヨンビヨンしなくなります。
openAngleはフリッパーが開いた時の角度で、closeAngleはフリッパーが閉じた時の角度です。
これらのパラメータは適宜調整してください。

        hj = gameObject.GetComponent<HingeJoint>();
        hj.useSpring = true;
        rb = gameObject.GetComponent<Rigidbody>();
        rb.useGravity = false;

これは、チェックの付け忘れ/外し忘れ防止のために、念のため書いているだけです。不要であれば削除可能です。

15
15
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
15
15