oniyarai’s tech memo

oniyarai’s tech memo

すぐ忘れる自分に捧げるメモ

オブジェクトのマウスカーソル追尾

Quaternion.Euler / Vector2.Lerp / Mathf.Atan2

マウスカーソル(四角のターゲットサイト)をミサイルが追尾する。また、ミサイルの向きはターゲットサイトを向くような処理を行う。 以下にコードを示す

public class BulletController : MonoBehaviour
{
    // GameControllerオブジェクト情報
    private GameObject GMcontrollerObj { get; set; } = default;
    // サイトのマウスカーソルへの追従補正(0.0 ~ 1.0 大きいほど追従が早い)Vector2.Lerpの第三引数
    private float BulletComp { get; set; } = 0.1f;

    // Start is called before the first frame update
    void Start()
    {
        GMcontrollerObj = GameObject.Find("GMcontroller");
    }

    // Update is called once per frame
    void Update()
    {
        // マウスポインタのワールド座標を取得
        Vector2 mousePosWorld = GMcontrollerObj.GetComponent<GMcontroller>().GetMousePositionWorld();
        // Bulletオブジェクト(ミサイル)の座標を取得(ワールド座標)
        Vector2 bulletPosWorld = this.transform.position;

        // マウスポインタ・Bulletオブジェクトの位置関係を算出
        float x = mousePosWorld.x - bulletPosWorld.x;
        float y = mousePosWorld.y - bulletPosWorld.y;

        // Bulletオブジェクトから見たマウスポインタの角度を求める(ラジアン)
        float rad = Mathf.Atan2(y, x);
        // ラジアンを弧度法に変換(3時方向を0度として反時計回りに+、時計回り方向に-)
        float deg = rad * Mathf.Rad2Deg;
        // オブジェクトをZ軸上で回転させる
        this.transform.rotation = Quaternion.Euler(0, 0, deg);
        // 線形補正を使用してマウスポインタ方向へ移動
        this.transform.position = Vector2.Lerp(this.transform.position, mousePosWorld, BulletComp);
}

29行でオブジェクトミサイルの角度を変更するが、角度は3時方向を0度として反時計回りに+180度まで、時計回りに-180度までとしてあらわされるため、オブジェクトは進行方向(ミサイルなら先端)を3時方向にしたスプライト画像である必要がある。

マウスカーソル(四角のターゲットサイト)をミサイルが追従する画像

f:id:oniyarai:20191108225035j:plainf:id:oniyarai:20191108231018j:plain

マウスカーソルの座標取得

Input.mousePosition

ゲームスクリーン上においてマウスカーソルが存在する座標を取得する。 以下のスクリプトで、input.mousePosition によってゲームスクリーン上にあるマウスカーソルの位置(スクリーン座標)を取得。 続く Camera.main.ScreenToWorldPoint(MousePosition); でスクリーン座標をワールド座標に変換する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GMcontroller : MonoBehaviour
{
    private Vector3 MousePosition { get; set; }
    private GameObject TextObj { get; set; }
    private Vector3 ScreenToWorldPointPosition { get; set; }
    // Start is called before the first frame update
    void Start()
    {
        GameObject CanvasObj = default;
        CanvasObj = GameObject.Find("Canvas");
        TextObj = CanvasObj.transform.GetChild(0).gameObject;

    }

    // Update is called once per frame
    void Update()
    {
        // マウスカーソルの位置を取得(スクリーン座標)
        MousePosition = Input.mousePosition;

        // 取得したスクリーン座標を、ワールド座標に変換する
        Vector3 ScreenToWorldPointPosition = Camera.main.ScreenToWorldPoint(MousePosition);
                                                      中略
        // スクリーン座標表示
        TextObj.GetComponent<Text>().text = "MousePosition\nX:" + MousePosition.x + "\nY:" + MousePosition.y;

f:id:oniyarai:20191107223805j:plain
スクリーン座標

        // ワールド座標表示
        TextObj.GetComponent<Text>().text = "MousePosition\nX:" + ScreenToWorldPointPosition.x + "\nY:" + ScreenToWorldPointPosition.y;

    }
}

f:id:oniyarai:20191107223809j:plain
ワールド座標

サウンド再生

Audio Source コンポーネント

音声を管理するオブジェクト(または、音声を再生するオブジェクト)にAudio Sourceコンポーネントをアタッチ。 その際、デフォルトではチェックが入ってるPlay On Awakeは外しておかないと、オブジェクトのAwake時に再生されてしまう。

f:id:oniyarai:20191105210814j:plain

続いてソースを生成しInspectorから音源データをsound1に設定する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

    private AudioSource AudioSourceComp { get; set; } = default;
    [SerializeField, Header("音源データを設定")] private AudioClip sound1;

    void Start()
    {
        // AudioSourceComponentを取得
        AudioSourceComp = gameObject.GetComponent<AudioSource>();
    }

f:id:oniyarai:20191105211338j:plain

音源データを設定したなら、PlayOneShotで音源を指定することでサウンドが生成される。

    void Update()
    {
        // 弾丸発射ボタン(スペース)の入力
        if (Input.GetKeyDown(KeyCode.Space)) {
                // 発射音を鳴らす
                AudioSourceComp.PlayOneShot(Sound1);
        }
    }

ランダム値生成

Random.Range

float の場合には、指定した下限値・上限値共にInclusiveだが、intの場合下限値はInclusiveで上限値はExclusiveになる。 つまり生成される値は0.0 ~11.0(float)と0~10(int)となる。

using UnityEngine;


float value = Random.Range(0f, 11f);

int value = RandomRange(0,11);