【Unity】ステルスゲージを作る #2

投稿者: | 2021-01-12

ステルスゲージを作る #1 のゲージの値を変えてみました。敵からプレイヤーの頭へのレイが視界の範囲内で当たっているときにゲージを増やします。

まずゲージのImageコンポーネントのSource Imageに真っ白いスプライトをアタッチします。

Colorで色を変えられます。Image TypeをFilledにすると、Fill Amountが0のときに画像が全く表示されず、1の時に全体が表示されます。Fill MethodとFill Originで、どの位置からどの方向へ画像が埋まっていくかを設定できます。

敵からのレイが当たるようにプレイヤーの頭にコライダーを付けました。頭にはMainCameraタグが付いています。

障害物のCubeにもBoxコライダーを付けました。

そして、敵のスクリプトのUpdateメソッドでレイを飛ばして、レイが頭に当たると内積を計算します。内積が0より大きい時にゲージに値を足します。

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

public class TestAgent : MonoBehaviour
{
    NavMeshAgent agent;

    // ゲージ
    public Gauge Gauge{ get; private set; }

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        GoNextPoint();
    }

    // Update is called once per frame
    void Update()
    {
        // 目的地に付いた時
        if (!agent.pathPending && agent.remainingDistance < 0.5f)
        {
            // 次の目的地を設定
            GoNextPoint();
        }

        // ゲージの位置と回転を変える
        if(Gauge!= null) Gauge.ChangePosRot(transform);


        // ゲージの値を増加
        float gaugeAmount = -0.01f;

        // 敵からプレイヤーへの方向
        Vector3 dir = Camera.main.transform.position - transform.position;

        RaycastHit hitInfo;
        
        // プレイヤーの頭にレイを飛ばす
        if (Physics.Raycast(transform.position, dir, out hitInfo, Mathf.Infinity))
        {
            // プレイヤーに当たった時
            if(hitInfo.collider.tag == "MainCamera")
            {
                dir = Vector3.Normalize(dir);
                float dot = Vector3.Dot(dir, transform.forward);

                // 内積を足す
                gaugeAmount += dot /10;
                
            }
        }

        // ゲージの値を増加
        Gauge.AddFillAmount(gaugeAmount);
    }


    // 次の目的地を設定
    void GoNextPoint()
    {
        agent.destination = TestAgentFactory.GetInstance().GetRandomPoint().position;
    }

    // ...
}

また、ゲージのスクリプトで、ImageコンポーネントのfillAmountに値をセットするメソッドを作りました。ゲージの値を足す時に敵のスクリプトでこのメソッドを呼んでいます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityStandardAssets.Characters.FirstPerson;

public class Gauge : MonoBehaviour
{
    RectTransform rt;
    Image image;

    private void Awake()
    {
        rt = GetComponent<RectTransform>();
        image = GetComponent<Image>();
    }

    // ...

    // ゲージを増やす
    public void AddFillAmount(float fillAmount)
    {
        float a = image.fillAmount;
        a += fillAmount;
        image.fillAmount = Mathf.Clamp(a, 0f, 1f);
    }
}

これでステルスゲージの値を変えられました。

コメントを残す

メールアドレスが公開されることはありません。