在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;
}