(Unity)マウスで照準器を動かす+照準器の位置に、戦車のヘッド部分をゆっくり旋回&砲塔の角度を調整する

<マウスで照準器を動かす>

(スクリプトの作成)

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

public class AimController_Z : MonoBehaviour
{
    public Vector3 targetPos;
    public Image aimImage;
    
    void Update()
    {
        // 「マウスの位置」と「照準器の位置」を同期させる。
        transform.position = Input.mousePosition;

        RaycastHit hit;

        // MainCameraからマウスの位置にRayを飛ばす
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);


        if (Physics.Raycast(ray, out hit))
        {
            // RayがColliderと衝突した地点の座標を取得
            targetPos = hit.point;
            print(targetPos);

            if(hit.transform.CompareTag("Enemy"))
            {
                // 照準器を赤色に変化させる。
                aimImage.color = new Color(1.0f, 0.0f, 0.0f, 1.0f);
            }
            else
            {
                // 照準器の色は白
                aimImage.color = new Color(1.0f, 1.0f, 1.0f, 1.0f);
            }
        }
        else
        {
            // 照準器の色は白
            aimImage.color = new Color(1.0f, 1.0f, 1.0f, 1.0f);
        }
    }
}

(設定)

  • スクリプトをAimオブジェクトに追加
  • 空欄にAimオブジェクトをドラッグ&ドロップ


(確認)

  • ゲームを再生して確認
  • マウスのカーソル位置に照準器が移動すれば成功です。


<照準器の位置に戦車のヘッド部分をゆっくり旋回&砲塔の角度を調整させる>

(ヘッド部分のスクリプト)

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

public class HeadController_Z : MonoBehaviour
{
    public AimController_Z acz;
    private Vector3 targetPosition;

    public float speed;
    private float step;

    void Update()
    {
        // (テクニック)「ターゲットの高さ」と「戦車ヘッドの高さ」を揃える。
        // これでヘッド部分が「真横に旋回」するようになる。
        acz.targetPos.y = transform.position.y;

        targetPosition = acz.targetPos;
      
        step = speed * Time.deltaTime;

        Vector3 targetDir = targetPosition - transform.position;

        Vector3 moveDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0f);

        transform.rotation = Quaternion.LookRotation(moveDir);
    }
}

(設定)

  • スクリプトを戦車のヘッド部分に追加
  • 空欄にAimオブジェクトをドラッグ&ドロップ
  • Speedは自由に設定


(確認)

  • ゲームを再生して確認
  • マウスを動かすと、ヘッド部分が左右に水平旋回すれば成功です。


(砲塔部分のスクリプト)

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

public class HeadController_Z2 : MonoBehaviour
{
    public AimController_Z acz;
    private Vector3 targetPosition;

    public float speed;
    private float step;

    void Update()
    {
        targetPosition = acz.targetPos;

        step = speed * Time.deltaTime;

        Vector3 targetDir = targetPosition - transform.position;

        Vector3 moveDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0f);

        transform.rotation = Quaternion.LookRotation(moveDir);
    }
}

(設定)

  • 砲塔オブジェクトはヘッド部分の子供に設定する(これで横旋回はヘッド部分と一体で行うようになる)
  • スクリプトを砲塔オブジェクトに追加
  • 空欄にAimオブジェクトをドラッグ&ドロップ
  • Speedは自由に設定


(確認)

  • ゲームを再生して確認
  • 照準器の位置に合わせて、砲塔の角度もゆっくり変化すれば成功です。