1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

銃を構えた先にレティクルを表示する

Last updated at Posted at 2018-07-14
スクリーンショット 2018-07-14 10.57.56.png

銃を構えたときに照準を表示したいなーと思い作成。

まず、カメラが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;
    }
}
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?