Unity:SpringJointを使用した滞空メモ

SpringJointをCoroutineで使っている。
ワイヤーアクションを作る過程でうまれた。
AnchorがAnkerになって間違っている。
JointはSetActiveとかenabledがないのでDestroyで破壊している。
対象のオブジェクトの座標のyを-3したところをめざして進む。(今回の場合はAnker)
AnkerLineはAnkerに向かって移動するオブジェクトとAnkerオブジェクトの間に生えてくる奴。
Jointを使うためAnkerオブジェクトにはRigidBodyが必要。
IsUsingInputはVertical/Horizontal Inputが0以外の時にTrueになる。
rigidBodyはこのスクリプトがアタッチされているオブジェクトのもの。
分岐はもっといいやりかたあるはず。

rigidBody.velocity = Vector3.zero;
rigidBody.angularVelocity = Vector3.zero;
の二つで慣性をなくしてる。

spring.autoConfigureConnectedAnchor = false;
やっとかないとわけわからんことになった。

IsStayinInAirはもしかしたら使うかもしれないからある。

private IEnumerator AnkerStayCoroutine()
{
    Vector3 UnderAnkerPosition = Anker.transform.position - new Vector3(0, 3f, 0);
    var firstHeading = Anker.transform.position - transform.position;
    var firstDistance = firstHeading.magnitude;
    var firstDirection = firstHeading / firstDistance;
    while (!IsUsingInput)
    {
        IsStayingInAir = true;
        var heading = UnderAnkerPosition - transform.position;
        var distance = heading.magnitude;
        var direction = heading / distance;
        float speed = Time.deltaTime * (AnkerMoveSpeed / moveSpeed);
        if(distance > 3f && !GetComponent<SpringJoint>())
        {
            transform.position = Vector3.MoveTowards(transform.position, UnderAnkerPosition, speed);
            Debug.Log(transform.position);
        }
        else if(distance == 3f && !GetComponent<SpringJoint>())
        {
            rigidBody.velocity = Vector3.zero;
            rigidBody.angularVelocity = Vector3.zero;
        }
        else
        {
            if (!GetComponent<SpringJoint>())
                {
                    gameObject.AddComponent<SpringJoint>();
                    var spring = GetComponent<SpringJoint>();
                    spring.connectedBody = Anker.GetComponent<RigidBody>();
                    spring.autoConfigureConnectedAnchor = false;
                    spring.spring = 3f;
                    spring.connectedAnchor = new Vector3(0f, 30f, 0f);
                    spring.minDistance = 1f;
                    spring.maxDistance = 2f;
                }
                Anker.GetComponent<Rigidbody>().isKinematic = true;
        }
        AnkerLine.transform.localScale = new Vector3(0.1f, 0.1f, (Anker.transform.position -         transform.position).magnitude);
        AnkerLine.transform.position = (Anker.transform.position + transform.position) * 0.5f;
        AnkerLine.transform.LookAt(Anker.transform.position);
        yield return null;
    }
    Destroy(GetComponent<SpringJoint>());
    Anker.GetComponent<RigidBody>().isKinematic = false;
    Anker.SetActive(false);
    AnkerLine.SetActive(false);
    IsStayingInAir = false;
    yield break;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA