概要
オープンワールド型のゲームを制作するため,Unityちゃんを使用し,車のオブジェクトを乗り降りするシステムを構築しました。
また,車のオブジェクトは,UnityのStandard AssetsのCarオブジェクトに自分で制作したカーモデルを貼り付けたものを使用しました。
一つのオブジェクトにまとめる
車のオブジェクト(Car),Unityちゃん(unitychan),車のfbxモデル(Car_model)を一つのゲームオブジェクト(今回は,Mineという名前にしました)にまとめます。
初期状態として,車のオブジェクトのみ非表示としておきます。
また,車のオブジェクトにはCarCamera,UnityちゃんにはMain Cameraという名前でそれぞれオブジェクト内にカメラを設置しました。
流れ
乗る時の大まかな流れは,キーボードのZキーを押して,Unityちゃんと車のfbxモデルの距離がある値(今回は5未満とした)より小さければ,車のfbxモデルの位置に車のオブジェクトを配置・表示し,Unityちゃんと車のfbxモデルは非表示にします。
降りるときは,Xキーを押して,車のオブジェクトの位置に,Unityちゃんと車のfbxモデルを配置し,
Unityちゃんと,車のfbxモデルを表示,車のオブジェクトは非表示にします。
プログラム
void Update()//Update関数内に記述
{
//事前に二つのオブジェクトの座標を取得
posA = transform.Find("unitychan").position;
posB = transform.Find("Car_model").position;
//乗る時
if (Input.GetKey(KeyCode.Z))//Zキーを押す
{
if (car == 0)
{
//Unityちゃんと車のfbxモデルの距離の値が5より小さいければ,実行
if (Vector3.Distance(posA, posB) < 5)
{
//車のfbxモデル位置に車のオブジェクトを配置
transform.Find("Car").position = transform.Find("Car_model").position;
//車のオブジェクトのローテーションに車のfbxモデルのローテーションを代入(あまり必要ないかも)
transform.Find("Car").rotation = transform.Find("Car_model").rotation;
//車のオブジェクトを表示
transform.Find("Car").gameObject.SetActive(true);
//Unityちゃんと車のfbxモデルを非表示に
transform.Find("unitychan").gameObject.SetActive(false);
transform.Find("Car_model").gameObject.SetActive(false);
car = 1;
}
}
}
//降りる時
if (Input.GetKey(KeyCode.X))//Xキーを押す
{
if (car == 1)
{
//車のオブジェクトの位置にUnityちゃんを配置
transform.Find("unitychan").position = transform.Find("Car").position;
//車のオブジェクトの位置に車のfbxモデルを配置
transform.Find("Car_model").position = transform.Find("Car").position;
//unityちゃんのローテーションに車のオブジェクトのローテーションを代入(こっちは重要)
transform.Find("unitychan").rotation = transform.Find("Car").rotation;
//車のfbxモデルのローテーションに車のオブジェクトのローテーションを代入(こっちは重要)
transform.Find("Car_model").rotation = transform.Find("Car").rotation;
//車のオブジェクトを非表示に
transform.Find("Car").gameObject.SetActive(false);
//Unityちゃんと車のfbxモデルを表示
transform.Find("unitychan").gameObject.SetActive(true);
transform.Find("Car_model").gameObject.SetActive(true);
car = 0;
}
}
}
結果(gifファイル)
乗る時
降りる時
おわり
一応,できたつもりですが,少ない知識の中で作成したので,もっと楽な方法があると思います。興味がある方は,他も調べてみてください。
参考させていただいたWebサイト
Unityオブジェクトの表示・非表示切り替え【非表示オブジェクトの読み込みも】
https://your-3d.com/unity-set-active/
【Unity C#】オブジェクト間の距離を取得する
https://futabazemi.net/unity/object_distance/
↧