iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0

最近要準備 Paper Reading 的報告,有點忙與緊張哈哈哈,所以今天就針對簡單的小功能說明。

在遊戲環境中,我們需要知道 Player 視角看出的角度與距離是否包含任何敵人,或是電腦設定的敵人也會在可視的角度與距離內產生一些特定的反應或可攻擊的範圍等,我們可以當作是一個可視的範圍等,那這裡就先以簡單的實作開始。

今天我們會說明到常見的 Vector3.Angle 與 Vector3.Distance 常見的使用方式。並且說明變更某物件上顏色 Material 的方法。今天的解說會用到非常實用的方法,就讓我開始介紹。

建置場景

  1. 首先先進行環境的設定,設定兩個物件,也就是 Player 與 Enemy 在場景中,如下。

撰寫腳本

  1. 首先我們設定一個可偵測的角度與距離。
public float angleRange = 60f;
public float distanceRange = 2f;
  1. 接下來新增兩個物件, Player 與 Enemy
public Transform Player, Enemy;
  1. 這邊我們使用該Unity 內建的強大 Vector3 內建的方法來做使用。 Vector3.Distance 兩物件的距離, Vector3.Angle 兩物件相差的角度來進行判定該 Enemy 有沒有在我們Player 的可視範圍內。
void detectEnemy() 
    {
        distance = Vector3.Distance(Player.position, Enemy.position);
        angle = Vector3.Angle(Player.forward, Enemy.position - Player.position);
        Debug.Log("Distance: " + distance + ", Angle: " + angle);


       if(distance < distanceRange)
       {
        if(angle < angleRange)
        {
            seeTarget = true;
        }else{
            seeTarget = false;
        }
       }else{
        seeTarget = false;
       }
    }
  1. 接下來去新增當被Player 看到的 Enemy 會變顏色,若被偵測到 Enemy 就變為紅色。 這邊我們會使用到 GetComponent().material.color 來變更該物件上的顏色。
// change the object color from the enemy object
        if(seeTarget)
        {
            Enemy.GetComponent<Renderer>().material.color = Color.red;      
    
        }else{
            Enemy.GetComponent<Renderer>().material.color = Color.blue;
        }
  1. 完整的程式碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerFieldView : MonoBehaviour
{
    public float radius, angle;
    private float distance;
    GameObject ob;
    MeshFilter meshFilter;
    MeshRenderer meshRenderer;
    Shader shader;

    public float angleRange = 60f;
    public float distanceRange = 2f;

    // set the enemy object and player object
    public Transform Player, Enemy;
    bool seeTarget = false;


    // The main driver function
    
    void Update() 
    {
        
        detectEnemy();

    }

    void detectEnemy() 
    {
        distance = Vector3.Distance(Player.position, Enemy.position);
        angle = Vector3.Angle(Player.forward, Enemy.position - Player.position);
        Debug.Log("Distance: " + distance + ", Angle: " + angle);


       if(distance < distanceRange)
       {
        if(angle < angleRange)
        {
            seeTarget = true;
        }else{
            seeTarget = false;
        }
       }else{
        seeTarget = false;
       }


        // change the object color from the enemy object
        if(seeTarget)
        {
            Enemy.GetComponent<Renderer>().material.color = Color.red;      
            Debug.LogWarning("Set!");        
        }else{
            Enemy.GetComponent<Renderer>().material.color = Color.blue;
        }
    }
}
  1. 回到 Unity 中執行
  • 會看到說當 Enemy 沒有在 Player 的視角內為藍色。可以觀察到目前 Console 顯示的角度與距離

  • 我們將Player 拉近到與Enemy 再近一點的話,Enemy就會變為紅色。可以觀察目前 Console 顯示的角度與距離。

結論

  1. 透過今天的實作User 視角的偵測,未來就可以根據距離與角度來讓敵人判斷是否偵測到玩家在其視角前並給予一些互動或是攻擊等。
  2. 以 Vector3.Angle, Vector3.Distance 可以實現兩個物件位置的距離與角度。
  3. 若要變更該物件的顏色可以使用GetComponent().material.color 來變更該物件上的顏色。

上一篇
Day14: Unity Camera Control 2
下一篇
Day16: Player Movement Control
系列文
Unity 基本功能實作與日常紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言