1. 程式人生 > >Unity學習日記-第二個Demo,指令碼間的引數傳遞

Unity學習日記-第二個Demo,指令碼間的引數傳遞

在最初的Unity學習裡面寫到了一個Demo,功能是當滑鼠懸停在一個cube時改變它的顏色。但該如何在不同的object 的指令碼之間進行控制的問題一直卡住了我,今天把Unity的Manual仔細又看了看,終於初步的實現了功能,在上次的基礎上重新設計了一個小Demo,功能是當滑鼠懸停Cube上時,改變顏色,並使聚光燈指向它,指令碼使用的是C#。(剛剛回顧了一下上次參考的blog,發現重要的知識點已經存在於裡面程式碼中,只是作者沒有強調出了,自己也就忽略了)

第一步,新建Project,搭建好基本的環境。把Direction Light強度調低一點,讓Spotlight顯現出來。剩下的工作就可以交給Scripts了。


第二步,建立2個Scripts,一個LookAtCube,附在Spotlight 上,用於指引Spotlight 的方向,第二個是SwitchLight,附在方塊上,讓Spotlight指向它。

LookAtCube.cs 非常簡單。Unity 的規則是大寫字母開頭的是函式或者結構體,小寫字母開頭的是變數,記住這一點再理解程式碼會輕鬆不少。

using UnityEngine;
using System.Collections;

public class LookAtCube : MonoBehaviour {

	public Transform target;//設定公開的變數,用於接收物件的transform資訊。

	// Use this for initialization
	void Start () {
		target = GameObject.Find ("Main Camera").transform;
		//用GameObject.Find(name)得到物件,使Spotlight預設指向攝像機
	}
	
	// Update is called once per frame
	void Update () {
		transform.LookAt (target);
	}
}

SwitchLight.cs的注意點在於GetComponent 是無法直接訪問其他Object的Component的,需要先用GameObject.Find() 訪問到其他的Object 再使用。
using UnityEngine;
using System.Collections;

public class SwitchLight : MonoBehaviour {

	Transform newTarget;
	Color oriColor;

	// Use this for initialization
	void Start () {
		newTarget = transform;
		oriColor = GetComponent<Renderer> ().material.color;
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnMouseOver(){
		GameObject.Find ("Spotlight").GetComponent<LookAtCube> ().target = newTarget;
		//直接使用GetComponent<LookAtCube>()s是無法訪問到target變數的,會返回null,
		//原因在於LookAtCube不是附在Cube上的Component,而是附在Spotlight上的,
		//GetComponent只能獲得當前Object上的Component。
		GetComponent<Renderer>().material.color = new Color(1f,0f,0.5f);
		//這個語句因為是訪問Object自己的元件,所以不需要使用Find查詢。
	}

	void OnMouseExit(){
		GameObject.Find ("Spotlight").GetComponent<LookAtCube> ().target = GameObject.Find ("Main Camera").transform;
		GetComponent<Renderer> ().material.color = oriColor;
	}
}

兩個指令碼完成後,把LookAtCube 拖到Spotlight 上,SwitchLight 拖到5個Cube上,Demo就完成了。

效果: