2-8 Help Writing Physics Code
今天要來跟大家介紹如何替場景中的物件寫程式碼,比方說我們要替場景中的風車物件製作選轉風車的動畫,如下圖。這時候你可以有兩種做法,第一種是用Animation的方式製作風車每個Frame旋轉多少,但這種做法較麻煩,如果以後要更改旋轉速度,又要重新製作Animation。
第二種做法是用Script控制,不但可以隨時更改旋轉速度的變數,且場景中有很多風車時,也可以替每個風車指定不同的旋轉速度,大幅省去製作Animation的諸多麻煩。
然後我有稍微更改了一下資料夾的佈置結構,這部分大家可以隨意,只要遵守自己固定的思路跟想法就好。我的習慣是將第三方套件的Prefab都放在World Objects中,要佈置關卡時都從這個資料夾拉Prefab。與第三方套件相關的其他檔案如FBX、Material之類的都放在Third Package資料夾。以及用來控制風車旋轉的SpinMe.cs就放在Utility資料夾,因為這個腳本可以運用在不只是風車旋轉的單一用途,屬於多方用途,所以放在Utility資料夾。
然後我們將WindMill的Prefab箭頭打開,會看見它分成兩個組件,風車的房子跟風車的風車.....(風車的風車是什麼啊!XD)
打開以後,應該可以看見分別有三個變數xDegreesPerFrame、yDegreesPerFrame、zDegreesPerFrame,代表每個Frame要旋轉幾度。請大家可以先動腦思考看看這個公式要怎麼寫,然後再看答案。
答案如下!
寫好以後,就請將風車放到場景中吧,此時就能發現風車自動旋轉了!
第二種做法是用Script控制,不但可以隨時更改旋轉速度的變數,且場景中有很多風車時,也可以替每個風車指定不同的旋轉速度,大幅省去製作Animation的諸多麻煩。
首先,請大家先下載風車的資源檔,然後匯入到Unity中。
然後我有稍微更改了一下資料夾的佈置結構,這部分大家可以隨意,只要遵守自己固定的思路跟想法就好。我的習慣是將第三方套件的Prefab都放在World Objects中,要佈置關卡時都從這個資料夾拉Prefab。與第三方套件相關的其他檔案如FBX、Material之類的都放在Third Package資料夾。以及用來控制風車旋轉的SpinMe.cs就放在Utility資料夾,因為這個腳本可以運用在不只是風車旋轉的單一用途,屬於多方用途,所以放在Utility資料夾。
然後我們將WindMill的Prefab箭頭打開,會看見它分成兩個組件,風車的房子跟風車的風車.....(風車的風車是什麼啊!XD)
在風車的風車中已經放置了SpinMe.cs,請大家打開。
打開以後,應該可以看見分別有三個變數xDegreesPerFrame、yDegreesPerFrame、zDegreesPerFrame,代表每個Frame要旋轉幾度。請大家可以先動腦思考看看這個公式要怎麼寫,然後再看答案。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpinMe : MonoBehaviour {
[SerializeField] float xRotationsPerMinute = 1f;
[SerializeField] float yRotationsPerMinute = 1f;
[SerializeField] float zRotationsPerMinute = 1f;
void Update () {
float xDegreesPerFrame = 0; // TODO COMPLETE ME
transform.RotateAround (transform.position, transform.right, xDegreesPerFrame);
float yDegreesPerFrame = 0; // TODO COMPLETE ME
transform.RotateAround (transform.position, transform.up, yDegreesPerFrame);
float zDegreesPerFrame = 0; // TODO COMPLETE ME
transform.RotateAround (transform.position, transform.forward, zDegreesPerFrame);
}
}
答案如下!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpinMe : MonoBehaviour {
[SerializeField] float xRotationsPerMinute = 1f;
[SerializeField] float yRotationsPerMinute = 1f;
[SerializeField] float zRotationsPerMinute = 1f;
void Update () {
//xRotationsPerMinute為1代表轉1圈,1圈有360度,將圈數乘以360度後再除以60秒,便得出1秒轉幾度
//Time.deltaTime為Update每次執行Frame經過了幾秒的基本時間單位,故將此單位乘以1秒所需旋轉的度數
//故能得出每個Frame要旋轉幾度
float xDegreesPerFrame = (xRotationsPerMinute * 360) / 60 * Time.deltaTime;
transform.RotateAround (transform.position, transform.right, xDegreesPerFrame);
float yDegreesPerFrame = (yRotationsPerMinute * 360) / 60 * Time.deltaTime;
transform.RotateAround (transform.position, transform.up, yDegreesPerFrame);
float zDegreesPerFrame = (zRotationsPerMinute * 360) / 60 * Time.deltaTime;
transform.RotateAround (transform.position, transform.forward, zDegreesPerFrame);
}
}






留言
張貼留言