iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Mobile Development

從無到有! Unity AR手遊開發日誌-以山海異聞錄為例系列 第 18

Day 18 | FPS滅火AR遊戲開發Part3 - 火焰生成

昨天的文章中已介紹火焰粒子的製作,那麼今天的文章將會說明如何在AR世界中產生火焰!

火焰產生器

在場景中,創建一個Empty GameObject,添加新的火焰產生器script,宣告物件變數,放入上一篇文章製作的火焰Prefab。

public Gameobject FlamePrefab;    

遊戲機制為計時到固定時間後,產生火焰,在限時內滅火一定數量即可通關。主要的框架如下:

void Update()
{
    if(產生 == true){
    
         Fire();//產生火焰function;

    }else{
 
        nextFireTime();計時下一次產生火焰funtion;

    }
}

因為產生器的機制與計時有關,所以放在Update()函式當中。

火焰產生器計時,時間一到就升火 nextFireTime()

在產生器的class當中宣告計時變數。

privae float generateTime = 0f;    

在計時的函式nextFireTime()中,如果計時超過了2.5秒,就呼叫產生函式Fire(),產生一朱火焰;如果還沒到產生時間,就讓generateTime持續增加Time.deltaTime,繼續計時。

nextFireTime()
{
    if(generateTime>2.5f)
    {
    
        Fire();  //產生火焰
    
    }else{
        
        generateTime += Time.deltaTime;
    
    }
}

隨機地點生成

在Fire()函式當中,產生火焰之前要先隨機選擇要產生的點:

  • 宣告int變數,儲存使用Random.Range函式生成的數值
  • 宣告Vector2變數,用來儲存之後要產生的Position
  • 利用switch選擇Position
  • 使用ViewportToScreenPoint
    • Viewport:相對於相機是標準化的。相機的左下角是 (0,0);右上角是 (1,1); z 位置以相機的世界單位為單位。
    • ScreenPoint:以像素為單位定義。屏幕左下角是(0,0);右上角是(pixelWidth , pixelHeight)。z 位置以相機的世界單位為單位。
  • 生成的火焰希望分別是三個位置,固定的y值。
int Randomnum;
Vector2 screenPosition;

Randomnum = Random.Range(0, 3);
switch (Ramdonnum)
{
    case 0:
    screenPosition = Camera.main.ViewportToScreenPoint(new Vector2(0.25f, 0.4f));
        break;
    case 1:
    screenPosition = Camera.main.ViewportToScreenPoint(new Vector2(0.5f, 0.4f));
        break;
    case 2:
    screenPosition = Camera.main.ViewportToScreenPoint(new Vector2(0.75f, 0.4f));
        break;
                }

射線、平面管理器

  • 在ARSessionOrigin中掛上AR PlaneManager及AR RaycaseManager兩個元件
  • 將AR Default Plane製成Prefab,放入AR PlaneManager的Plane Prefab中(不喜歡預設的Plane可以針對Mesh的部分做更改)

射線、平面碰撞

在產生器的class當中宣告ARRaycastManager,在Unity將ARSessionOrigin放入。

public ARRaycastManager raycastManager;
  • 宣告撞擊List,儲存射線撞擊物體的訊息。
  • 使用Raycast,從螢幕座標的一個點向可追蹤類型投射光線。
  • 如果有撞擊發生,取得撞擊的第一個位置作為產生火焰的位置。
List<ARRaycastHit> hits = new List<ARRaycastHit>();
raycastManager.Raycast(screenPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.Planes);
if (hits.Count > 0)
{
    GameObject.Instantiate(FlamePrefab, hits[0].pose.position, hits[0].pose.rotation);
}

今天的文章利用 Raycasy Hit搭配Plane偵測,順利的讓火焰在AR世界中產生了,下一篇就會撰寫滅火的部分,那就明天見~


上一篇
Day 17 | FPS滅火AR遊戲開發 Part2 - 火焰粒子系統製作
下一篇
Day 19 | FPS滅火AR遊戲開發Part4 - 噴水、滅火
系列文
從無到有! Unity AR手遊開發日誌-以山海異聞錄為例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言