
銃を構えたときに照準を表示したいなーと思い作成。
まず、カメラがAIM状態になったとき、レティクルを表示する。カメラを操作するスクリプトの一部です。
省略されていますが、レティクルはSetActive(false)で、ヒエラルキー上にあります。
csharp.cs
void FixedUpdate () {
transform.position = new Vector3(Player.position.x, transform.position.y, Player.position.z); //プライヤー位置を追従する
transform.RotateAround(transform.position, Vector3.up, Input.GetAxis("Mouse X")* RotateSpeed); //横回転
transform.RotateAround(transform.position, transform.right, -Input.GetAxis("Mouse Y")* RotateSpeed); //縦回転
//AIM時のカメラ挙動
if (PlayerController.isAIM)
{
RotateSpeed = 0.3f;
Cam.transform.DOMove(AimPosition.position, 1);
//カメラ中心の先を取得するため
CameraRay = new Ray(Cam.transform.position, Cam.transform.forward);
//レイの当たり判定
if(Physics.Raycast(CameraRay, out CameraHit)){
if (CameraHit.collider.gameObject.tag == "ignoreRay") return;
Reticle.SetActive(true);
Reticle.transform.position = CameraHit.point;
}
}
else
{
RotateSpeed = 1.0f;
Reticle.SetActive(false);
Cam.transform.DOMove(DefaultPosition.position, 1);
}
}
次に、レティクルが距離によらず一定の大きさになるコードを、
レティクルへアタッチします。
こちらは下記を参考にしました。
【参考】 [Perspectiveカメラからの距離が変化しても見た目の大きさは変わらないオブジェクトを作る]
(https://qiita.com/r-ngtm/items/e4df707d45b097999776)
ReticleController.cs
using UnityEngine;
public class ReticleController : MonoBehaviour {
Vector3 baseScale; // カメラからの距離が1のときのスケール値
private void Start()
{
// カメラからの距離が1のときのスケール値を算出
this.baseScale = this.transform.localScale / GetDistance();
}
void Update () {
transform.localRotation = Quaternion.Euler(0, Camera.main.transform.localRotation.y, 0);
//カメラからの距離によらず、一定の大きさで表示させる
this.transform.localScale = this.baseScale * this.GetDistance();
}
// カメラからの距離を取得
float GetDistance()
{
return (transform.position - Camera.main.transform.position).magnitude;
}
}