Unity

Unity OnCollisionEnter的應用

在Unity的3D世界中,當主角在世界中走動時,最簡單的互動就是讓主角去碰觸到世界中的物體,我們可以透過碰撞事件的發生,來決定要產生什麼相對應的動作,這些動作可以是發出聲音、播放影片或音樂,也可以讓主角人物切換到另外一個場景去,在這篇文章中,我們就來看看該如何編寫這樣的程式。

假設我們已經有幾個3D的世界,分別放在不同的Scene中,如同前面文章中的說明,要能夠切換場景,需要在Build Settings加入它們,這點非常地重要,如下所示:

接著,假設我們在世界中設計了幾個Cube以及Sphere物件,放在主角前面等待主角的互動,如下圖所示:

其中那個球希望它可以自行彈跳,並在接觸地面時發出音效,第一件事是把音效拖曳到球物件上再放開,然後設計以下的程式,讓它可以自行發出音效:

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

public class BallSound : MonoBehaviour
{
    public AudioSource BounceSFX = null;

    private void OnCollisionEnter(Collision collision)
    {
        BounceSFX.Play();
    }
}

當然,前提是它必須要有一個可以讓它彈跳的Physic Meterial,並設定好正確的AudioSource。另外3個Cube物件一個用來切換場景,一個用來播放影片,另外一個則是用來播放聲音,它的程式如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Video;

public class PlayerControl : MonoBehaviour
{
    private bool VideoPlaying = false;
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name.Contains("CubeSound"))
        {
            if (collision.gameObject.GetComponent<AudioSource>() != null)
            {
                collision.gameObject.GetComponent<AudioSource>().Play();
            }
        }
        else if (collision.gameObject.name.Contains("CubeTV"))
        {
            if (collision.gameObject.GetComponent<VideoPlayer>() != null)
            {
                if (VideoPlaying)
                {
                    collision.gameObject.GetComponent<VideoPlayer>().Pause();
                    VideoPlaying = false;
                }
                else
                {
                    VideoPlaying = true;
                    collision.gameObject.GetComponent<VideoPlayer>().Play();
                }
                
            }
        }
        else if (collision.gameObject.GetComponent<SceneInfo>()!=null)
        {
            SceneManager.LoadScene(collision.gameObject.GetComponent<SceneInfo>().SceneName);
        }
    }
}

這個程式我們把它命名為PlayerControl,並把它附加在主角身上。另外,那個切換場景的操作,因為還需要有一個要切換到的場景名稱,所以該物體也需要再編寫另外一個程式,在此把它命名為SceneInfo,內容如下:

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

public class SceneInfo : MonoBehaviour
{
    public string SceneName = null;
}

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s