プレハブをインスタンス化したときの向きを簡単に設定してみました。
Instantiateメソッドの第三引数にプレハブの回転値を渡すと、プレハブのインスペクタのRotationの値が使われます。
using UnityEngine;
public class InstantiatePhotoFrame : MonoBehaviour
{
[SerializeField] GameObject photoFrame; // 写真立てのプレハブ
[SerializeField] float offsetY;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// クリックした場所でインスタンス化する
if(Input.GetMouseButtonDown(0))
{
Vector3 pos = GetHitPosition3D();
pos.y += offsetY;
Instantiate(photoFrame, pos, photoFrame.transform.rotation);
}
}
Vector3 GetHitPosition3D()
{
// マウスカーソルからカメラが向く方へのレイ
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// レイを飛ばす
RaycastHit hitInfo;
if(Physics.Raycast(ray,out hitInfo,Mathf.Infinity))
{
// 当たった場所
return hitInfo.point;
}
return default;
}
}
なので、プレハブの回転値を変えると、インスタンスの向きを簡単に変えられます。プレハブの向きは、インスペクタのOpen Prefabをクリックすると、シーンビューで変更できます。
常にカメラの方を向かせる
動くカメラに向きを合わせたいときは、まずプレハブの正面にしたい方をワールドのZの逆方向に向けます。
そして、インスタンス化するときに、プレハブの回転値にカメラの回転値をかけます。クォータニオンを同士をかけると回転が合成されます。
FPSコントローラーを使うときは、体の回転をかけた後に、頭のカメラのローカルの逆回転をかけます。
using UnityEngine;
public class InstantiatePhotoFrame2 : MonoBehaviour
{
[SerializeField] GameObject photoFrame; // 写真立てのプレハブ
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
// カメラの目の前の位置
Vector3 pos = Camera.main.transform.position + Camera.main.transform.forward;
// プレハブの回転値にプレイヤーの回転値をかける
Quaternion rot = photoFrame.transform.rotation * transform.rotation * Quaternion.Inverse(Camera.main.transform.localRotation);
//Quaternion rot = photoFrame.transform.rotation * Quaternion.Inverse(Camera.main.transform.localRotation) * transform.rotation;
Instantiate(photoFrame, pos, rot);
}
}
}
このスクリプトはFPSキャラの体に付いています。
体と頭のかける順番を逆にすると結果が変わります。