『Unity5ゲーム開発レシピ』「Part01 基本編 Chapter06 ユーザーインターフェースを作成する」 学習記録3

Unity5ゲーム開発レシピ ハマるゲーム制作のノウハウ

Unity5ゲーム開発レシピ ハマるゲーム制作のノウハウ

序文

『Unity5ゲーム開発レシピ』10日目。

国民健康保険料を支払ってきました。31万円でした。(言っちゃう)
高いよー。

GitHub

github.com

進捗

(学習時間:2時間)

コード実装部分

\Chapter1\Assets\Scripts\LockOn.cs

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

public class LockOn : MonoBehaviour
{
  GameObject target = null;

  bool isSearch;

  public Image lockOnImage;

  public GameObject enemyAp;

  public Image gaugeImage;

  public Text textDistance;

  void Start()
  {
    isSearch = false;

    lockOnImage.enabled = false;

    enemyAp.SetActive(false);
  }

  void Update()
  {
    if (Input.GetButtonDown("Lock"))
    {
      // ロックオンモードに切り替え
      isSearch = !isSearch;

      // ロックを解除する
      if (!isSearch)
        target = null;
      else
        // 一番近いターゲットを取得する
        target = FindClosestEnemy();
        // ターゲットを取得する
        //target = GameObject.FindWithTag("Enemy");
    }

    // ロックオンモードで敵がいれば敵の方を向く
    if (isSearch)
    {
      if (target != null)
      {
        // ターゲットの方向を向く
        // transform.LookAt(target.transform);

        // スムーズにターゲットの方向を向く
        Quaternion targetRotation = Quaternion.LookRotation(target.transform.position - transform.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 10);
        // ただしX軸とZ軸は回転させない
        transform.rotation = new Quaternion(0, transform.rotation.y, 0, transform.rotation.w);

        // カメラをターゲットに向ける
        Transform cameraParent = Camera.main.transform.parent;
        // カメラをどう回転させるかを取得
        Quaternion targetRotation2 = Quaternion.LookRotation(target.transform.position - cameraParent.position);
        // 速度を指定してカメラを回転させる
        cameraParent.localRotation = Quaternion.Slerp(cameraParent.localRotation, targetRotation2, Time.deltaTime * 10);
        // ただしY軸とZ軸は回転させない
        cameraParent.localRotation = new Quaternion(cameraParent.localRotation.x, 0, 0, cameraParent.localRotation.w);
      }
      else
      {
        // ロックオンモードでロックしていなければ敵を探す
        target = FindClosestEnemy();
      }
    }

    if (target != null)
    {
      // 距離が離れたらロックを解除する
      if(Vector3.Distance(target.transform.position, transform.position) > 100)
      {
        target = null;
      }
    }

    // ターゲットがいたらロックオンカーソルを表示する
    bool isLocked = false;

    if (target != null)
    {
      isLocked = true;

      lockOnImage.transform.rotation = Quaternion.identity;

      // ターゲットの表示位置にロックオンカーソルを合わせる
      lockOnImage.transform.position = Camera.main.WorldToScreenPoint(target.transform.position);

      // 敵の体力をゲージに反映させる
      Enemy targetScript = target.GetComponent<Enemy>();
      gaugeImage.transform.localScale = new Vector3((float)targetScript.armorPoint / targetScript.armorPointMax, 1, 1);

      // 敵との距離を表示する
      textDistance.text = Vector3.Distance(target.transform.position, transform.position).ToString();
    }
    else
    {
      // ロックオンモード時はカーソルを回転する
      lockOnImage.transform.Rotate(0, 0, Time.deltaTime * 200);
    }

    lockOnImage.enabled = isSearch;

    // 敵の体力ゲージの表示を切替可能にする
    enemyAp.SetActive(isLocked);
  }

// (以下略)
  • その他実装部分

github.com

実行結果

www.youtube.com

感想

やったこと。

  • プレイヤーの残り体力によって体力ゲージの色を変える
  • ロックオンカーソルの表示
  • 索敵中にロックオンカーソルを回転させる
  • ロックオンした敵の体力ゲージと距離を表示する

ここらへんの内容はプログラミングの技術というより、ゲームを魅力的に演出するTips的な部分が大きくて、なかなか実践的で感心しながらすすめている。

ゲームを作るにあたって、こういう内容は本当に大事だと思うなぁ。
同じ内容のツイートでも漫画にしないと誰も読んでくれないもんね。(笑)

カロリーメイトください。

BGM

10 Balls + 2 / RHYMESTER feat. KICK THE CAN CREW

www.youtube.com