【Unity】スクリプトで親要素を動的に変更する方法
やりたかったのは下の動画のように、プレイヤーと幽霊が接触すると幽霊がプレイヤーに追従するようになる、という処理です。ここではこの処理の実装方法と合わせて、オブジェクトの親要素をスクリプトで切り替える方法を説明します。
ちなみにこの動画はUnity1weekという1週間ゲームジャムで作ったゲームの動画です。以下のリンクからプレイできますので、よかったらプレイしてみてください。

環境
- Unity 5.6.0f3
このページの構成
ポイント
- 手順としては以下のとおりです。動的に親要素を変更する処理は②にあります。
- ① プレイヤーと幽霊にcolliderをアタッチする。幽霊の方はis Triggerにチェックをつけておく。
- ② プレイヤーと接触したら、幽霊をプレイヤーの子要素に変更する。
- ③ 幽霊の横方向の移動を止める。
- ④ 幽霊の向きを変える。
- ⑤ 幽霊の位置を調整する。
スクリプト全文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GhostController : MonoBehaviour { public float SPEED = 0.5f; // Use this for initialization void Start () { //上下の移動 MoveUp (); } void MoveUp(){ iTween.MoveBy(this.gameObject, iTween.Hash( "y", 0.3, "easeType","easeOutQuad", "loopType","none", "delay", 0, "oncomplete", "MoveDown") ); } void MoveDown(){ iTween.MoveBy(this.gameObject, iTween.Hash( "y", -0.3, "easeType","easeOutQuad", "loopType","none", "delay", 0, "oncomplete", "MoveUp") ); } // Update is called once per frame void Update () { //横方向の移動 Vector2 position = transform.position; position.x -= SPEED * Time.deltaTime; transform.position = position; } void OnTriggerEnter2D(Collider2D col){ if (col.gameObject.tag == "Player") { this.gameObject.transform.parent = col.gameObject.transform; //プレイヤーを親要素に設定 this.gameObject.tag = "Player"; transform.localScale = new Vector3 (-1, 1, 1); //向きを反転する transform.localPosition = new Vector3 (-0.4f, 0, 0); //位置をプレイヤーの後ろに変更 GetComponent<GhostController> ().enabled = false; //GhostControllerスクリプトの処理をストップする } } } |
処理の説明
前準備
プレイヤーにRigidBodyとColliderをアタッチしてください。タグも「Player」に変更しています。幽霊にはColliderをアタッチし、is Triggerにチェックをつけておいてください。
プレイヤーと幽霊が接触したら、幽霊をプレイヤーの子要素にする
幽霊に下のGhost Controllerスクリプトをアタッチします。移動処理については特に説明しませんので、下記スクリプトを参考にしてください(iTweenというアセットを使用しています)。
接触時の処理はOnTriggerEnter2Dに書かれている部分です。transform.parentにプレイヤーのtransformを指定して、幽霊をプレイヤーの子要素に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public class GhostController : MonoBehaviour { public float SPEED = 0.5f; // Use this for initialization void Start () { //上下の移動 MoveUp (); } void MoveUp(){ iTween.MoveBy(this.gameObject, iTween.Hash( "y", 0.3, "easeType","easeOutQuad", "loopType","none", "delay", 0, "oncomplete", "MoveDown") ); } void MoveDown(){ iTween.MoveBy(this.gameObject, iTween.Hash( "y", -0.3, "easeType","easeOutQuad", "loopType","none", "delay", 0, "oncomplete", "MoveUp") ); } // Update is called once per frame void Update () { //横方向の移動 Vector2 position = transform.position; position.x -= SPEED * Time.deltaTime; transform.position = position; } void OnTriggerEnter2D(Collider2D col){ if (col.gameObject.tag == "Player") { this.gameObject.transform.parent = col.gameObject.transform; //プレイヤーを親要素に設定 this.gameObject.tag = "Player"; } } } |

横方向の移動を止める
横方向の移動処理を止めていないため、このままだとそのまま画面外に移動してしまいます。GhostControllerに以下の記述を追加して横移動をストップします。なお、以降はOnTriggerEnter2D内のみ記載します。
1 2 3 4 5 6 7 8 9 |
void OnTriggerEnter2D(Collider2D col){ if (col.gameObject.tag == "Player") { this.gameObject.transform.parent = col.gameObject.transform; //プレイヤーを親要素に設定 this.gameObject.tag = "Player"; //ここ追加 GetComponent<GhostController> ().enabled = false; //GhostControllerスクリプトの処理をストップする } } |

幽霊の向きを変える
幽霊がプレイヤーと反対方向を向いたままなので向きを反転します。GhostControllerに以下の記述を追加して幽霊の向きを反転します。
1 2 3 4 5 6 7 8 9 10 |
void OnTriggerEnter2D(Collider2D col){ if (col.gameObject.tag == "Player") { this.gameObject.transform.parent = col.gameObject.transform; //プレイヤーを親要素に設定 this.gameObject.tag = "Player"; //ここ追加 transform.localScale = new Vector3 (-1, 1, 1); //向きを反転する GetComponent<GhostController> ().enabled = false; //GhostControllerスクリプトの処理をストップする } } |

幽霊の位置を調整する
幽霊を常にプレイヤーの後ろに位置するように修正します。GhostControllerに以下の記述を追加して幽霊の位置を調整します。
1 2 3 4 5 6 7 8 9 10 11 |
void OnTriggerEnter2D(Collider2D col){ if (col.gameObject.tag == "Player") { this.gameObject.transform.parent = col.gameObject.transform; //プレイヤーを親要素に設定 this.gameObject.tag = "Player"; transform.localScale = new Vector3 (-1, 1, 1); //向きを反転する //ここ追加 transform.localPosition = new Vector3 (-0.4f, 0, 0); //位置をプレイヤーの後ろに変更 GetComponent<GhostController> ().enabled = false; //GhostControllerスクリプトの処理をストップする } } |
