概要
オープンワールド型のゲームを制作するため,Unityちゃんを使用し,車のオブジェクトを乗り降りするシステムを構築しました。 また,車のオブジェクトは,UnityのStandard AssetsのCarオブジェクトに自分で制作したカーモデルを貼り付けたものを使用しました。一つのオブジェクトにまとめる
車のオブジェクト(Car),Unityちゃん(unitychan),車のfbxモデル(Car_model)を一つのゲームオブジェクト(今回は,Mineという名前にしました)にまとめます。 初期状態として,車のオブジェクトのみ非表示としておきます。 また,車のオブジェクトにはCarCamera,UnityちゃんにはMain Cameraという名前でそれぞれオブジェクト内にカメラを設置しました。 ![Mineオブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/641f8914-0835-e38e-1d66-3c8e346981a0.png)※このテストでは,どちらのオブジェクトもHierarchyで生成したMain Cameraを使用しましたが,
Unirtちゃんの方は,下の写真のように,
Assets➡unity-chan!➡Unity-chan!Model➡Prefabs➡for Locomotion
のフォルダ内にあるMain Cameraを使用し,CamPos,FrontPos,JumpPos,LookAtPosもUnityちゃんのオブジェクト内に付け加えた方が,ジャンプした時などにエラーが出ないようになります。(エラーが出ても,ゲーム自体はストップしませんでしたが…)
流れ
乗る時の大まかな流れは,キーボードのZキーを押して,Unityちゃんと車のfbxモデルの距離がある値(今回は5未満とした)より小さければ,車のfbxモデルの位置に車のオブジェクトを配置・表示し,Unityちゃんと車のfbxモデルは非表示にします。 降りるときは,Xキーを押して,車のオブジェクトの位置に,Unityちゃんと車のfbxモデルを配置し, Unityちゃんと,車のfbxモデルを表示,車のオブジェクトは非表示にします。プログラム
``` using System.Collections; using System.Collections.Generic; using UnityEngine;public class Change : MonoBehaviour
{
int car = 0;
Vector3 posA;
Vector3 posB;
void Start()
{
}
void Update()//Update関数内に記述
{
//事前に二つのオブジェクトの座標を取得
posA = transform.Find("unitychan").position;
posB = transform.Find("Car_model").position;
//乗る時
if (Input.GetKey(KeyCode.Z))//Zキーを押す
{
if (car == 0)
{
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;
}
}
}
}
このプログラムをMineオブジェクトにドラッグしました。
<h1>結果(gifファイル)</h1>
乗る時
![車乗るgif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/b62b3aad-8832-3687-a508-93cb8e5f23ed.gif)
降りる時
![降りるgif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/ceffdae7-deb0-9ca2-59a7-519795e65a1d.gif)
<h1>おわり</h1>
一応,できたつもりですが,少ない知識の中で作成したので,もっと楽な方法があると思います。興味がある方は,他も調べてみてください。
<h1>参考させていただいたWebサイト</h1>
Unityオブジェクトの表示・非表示切り替え【非表示オブジェクトの読み込みも】
https://your-3d.com/unity-set-active/
【Unity C#】オブジェクト間の距離を取得する
https://futabazemi.net/unity/object_distance/