蒼水技術録

蒼水家技術録

蒼水が普段制作とか勉強とかして覚えたことを復習としてまとめてるものです。 それが最適解かどうかはわからないけど、何を目的として始めて、何が必要で、実際何をやって、どうなったか、まで全部過程を残すための技術ブログです。

Unityスクリプト編 #1 -動的に親子関係を作成/解除する-

今回は複数のオブジェクトを動的に親子関係する検証をしていたのでそのまとめになります。
完成図はこんなかんじになります。

今回の目的

目的としては今VR開発編でやっているハンドトラッキング関連で、手でモノを持ちたい場合に持ちたい対象を手の子にしてやれば実質「持つ」ことができるようになります。
=手を動かしたらその手にモノがくっついてくる、という挙動を取らせることができる。

最初に出した動画でうちの子の手に刀がついてきてますよね。そんな感じです。
他にもっと良い方法があれば知りたい...。

親子関係とは?

近い概念で言えばフォルダとその中にあるファイル群、みたいな関係ですね。
Unityだとこんな感じです

f:id:Yui_Aomi:20200119144533p:plain
親子関係の例
上図でいう「IKTarget」が親で、その中にある「LeftIK/RightIK」が子の親子関係です。また「LeftIK」と「RightIK」が親子関係のない状態です。
もう一例、「Blade」が親で、その中にある「Blade/saya」が子の親子関係です。

親子関係では何が起こるかといえば親を動かすと子も一緒に同様に動く(ついてくる)という点かなと思います。
親を右に動かしたら子も一緒に右に動きます。回転させれば同じように回転します。ただそれだけです。

親子関係にするためのコード(Transform.parent)

Transform.parentというものが用意されているのでこいつを使っていきます
公式のドキュメントはこちら
docs.unity3d.com


実際に自分が書いたコードがこんな感じです。(サンプルコード後で全体載せています)

 this.gameObject.transform.parent = RootObject.gameObject.transform;

こう書いてやればどうやら親子関係が作れるらしい。

 this.gameObject.transform.parent = null;

逆に親子関係を解除する場合はこう。

サンプルコード

今回自分が書いたコードの全体です。単純に動作検証用のものなので最低限しか入れていません。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParentObj : MonoBehaviour{

    public GameObject RootObject;

    // Start is called before the first frame update
    void Start(){
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.X)) {
            this.gameObject.transform.parent = RootObject.gameObject.transform;
        }

        if (Input.GetKey(KeyCode.Z)) {
            this.gameObject.transform.parent = null;
        }
    }
}

解説

今回親子関係の動作が確認できればよかったためキーボードからの入力で指定したオブジェクトを親にして、自分が子になるだけスクリプトです。
前項の親子関係にするためのコード(Transform.parent)でもはや完結している気がするのであとは割愛します。

まとめ

Transform.parent使えば親子関係ができる。以上!
思ったほど情報量がなくてなんともアレですね....

とはいえこれだけわかってればやりたいことでできることがちょっと増えるので開発に取り入れていこうかなと思います。
ハンドトラッキングの方の進捗をお楽しみに。