てふノート

てふたろうの考えてること

【動的親子関係】てふメモ その壱【Unity】

 


おはようございます、てふたろうです。

Unityで親子関係をいじってたので、忘れないように一応メモを残しておこうかなと、
一応拾って来た解説もまとめる感じにしてみました


あと当たり判定についても書かなきゃだめっぽい



書いてたのはこれ
ルービックキューブを作ろうとして、オブジェクトの役割が場合によって変わるのを表現したくてテストで書いてた。

昨日書いたやつは効率いいけど条件分岐多すぎて頭おかしくなったから一から作り始めてます。

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

public class family : MonoBehaviour
{
    public GameObject parent;
    public GameObject child;
    
    public void OnTriggerStay(Collider collision)
    {
        string layerName = LayerMask.LayerToName(collision.gameObject.layer);
        if (layerName == "Cube")
        {
            child = collision.gameObject;
            child.transform.parent = parent.transform;
            //Debug.Log("接触");
        }
    }

    public void OnTriggerExit(Collider collision)
    {
        child.transform.parent = null;
    }
}


わかりにくいですが、
親となるオブジェクトが"Cube"レイヤーにあるオブジェクトに触れた際、Colliderが接触し続ける限りtransformを親が支配する?

まあそんなかんじ、親の移動に子供が相対位置を維持するってこと。
実演したのがこれ


f:id:tefutarou:20190321040927g:plain




親子関係についてのメモ


とりあえず親子関係っていうのはこれのこと、
f:id:tefutarou:20190321060134p:plain



基本的には上のオブジェクトは下のコンポーネントを持ってるって考えていいのかな、
Transformに限定して言うとさきほど言ったように相対位置を維持するみたい、
加速度がかかると相対位置にもズレが出てくるっぽい、Rigidibobyをよく知らないからそのへんは妄想だけど


親子関係を形成する

Aの親=B。代入すれば関係成立するみたい。

A.transform.parent=B.transform;
親子関係を解除する

nullを代入すれば絶縁できるらしい。

A.transform.parent=null
親のオブジェクトを取得する

ルーツってことかしら。

GameObject oya;
oya=transform.root.gameObject;
指定した子供のオブジェクトを取得する

tefutarouを探して取得するやつ。

GameObject ko;
ko=transform.Find("tefutarou").gameObject;

 


当たり判定のメモ

Collision関数

OnCollisionEnter

他のCollider、rigidbodyに触れたときに呼び出される。

void OnCollisionEnter(Collision other){ }
OnCollisionExit

他のCollider、rigidbodyから離れたときに呼び出される。

void OnCollisionExit(Collision other){ }
OnCollisionStay

他のCollider、rigidbodyが触れている間繰り返し呼び出される。

void OnCollisionStay(Collision other){ }

 

Trigger関数

OnTriggerEnter

他のtriggerイベントに侵入したとき。Collider(IsTrigger=true)に対して有効。

void OnTriggerEnter(Collider other){ }

OnTriggerExit、OnTriggerStayも上記同様に動作。


CollisionとTriggerの違い

TriggerはColliderのIsTrigger=trueが必要条件。
Collisionは両方がColliderとRigidbodyを必要とする。
f:id:tefutarou:20190321053656p:plain

このへんはもう少し勉強。




追記メモ

レイヤーで当たり判定をする場合
void OnTriggerExit(Collider other)
{
     string layerName = LayerMask.LayerToName(other.gameObject.layer);
     if(layerName=="kabe"){ }
}
タグで当たり判定をする場合

タグはcomponentの感覚で取得できる?のかな?

void OnTriggerStay(Collider other)
{
     if(other.gameObject.tag=="kabe"){ }
}


 
 

あとがき

ルービックキューブをゲーム性とか考えずに物理的に表現したかったら内部構造パクって作れば行けそうなんだよな。
数学に強い方のアプローチだとどうやら座標計算になるらしい、そのへんはよくわからんので今回はパス。

 


僕はとりあえず、
①プレイヤーがクリックしようとした集合(9つの箱で構成される1面)をエフェクトを用いて視覚化。
②クリックされたら1面を1つのオブジェクトに統合。
③ドラックによって1軸回転出来るようにする。
④離されたらオブジェクトの集合化を解除。ただし立方体を保つように自動回転するように調整。

⑤ゲーム性を持たせる。タイムUIの表示やタイトルなど。

⑥オリジナリティを持たせる。スロットの要素を入れて華やかに彩るなど。



を考えています
が、はたしておわるのだろうか。


今回はとりあえずのメモ投稿ということで、
ぽやしみ~

steamcommunity.com