この記事の内容は、Unity 5.4.1以降で動作を確認しています。
内容
VRアプリで多用するRayを見やすくする方法の一つになると思います。
Raymanager.cs
public class RayManager : MonoBehaviour {
//Rayの基本設定用
public GameObject dive_Camera; //(VR用カメラとして使用させてもらっています)
public GameObject reticle; //表示したい画像をアタッチ
Vector3 defaultPos;
Quaternion defaultRotation;
public float rayDistance;
void Start () {
//Rayの初期化設定
defaultPos = reticle.transform.localPosition;
defaultRotation = reticle.transform.localRotation;
}
void Update () {
//Rayの射出(VR用にdive_Cameraを使用しているがRayを生成すれば何でもよい)
Ray ray = new Ray(dive_Camera.transform.position, dive_Camera.transform.rotation * Vector3.forward);
RaycastHit hit;
//Rayが当たっているときの処理
if (Physics.Raycast(ray, out hit, rayDistance)) {
//Rayの可視化(デバッグ用)
Debug.DrawLine(dive_Camera.transform.position, hit.point, Color.red);
Debug.DrawRay(hit.point, hit.normal, Color.green);
//Rayの位置・動作を決める部分
reticle.transform.rotation = Quaternion.LookRotation(hit.normal);
reticle.transform.position = hit.point + (hit.normal * hitRayPosition); //hitRayPosition は画像が当たった対象にめり込まない程度に設定する
//略
}
//デフォルトのRayの位置
else {
reticle.transform.localPosition = new Vector3(0, 0, defaultPos.z);
reticle.transform.localRotation = defaultRotation;
}
}
}
タイトル回収に重要なのはreticle.transform.rotation
の部分です。↓のように書くことで、画像の表れ方に味を加えることもできます。
reticle.transform.rotation = Quaternion.Slerp(reticle.transform.rotation, Quaternion.LookRotation(hit.normal), Time.deltaTime * 10.0f);
↓のような動作になります。
Rayの当たった位置にオブジェクトを生成する場合などにも使用できるので、試してみてください。
参考
(http://answers.unity3d.com/questions/16952/instantiate-based-on-raycasthitnormal.html)
(https://docs.unity3d.com/ja/current/ScriptReference/RaycastHit-normal.html)
(https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.LookRotation.html)