Related Posts Plugin for WordPress, Blogger...

2-8 Help Writing Physics Code

今天要來跟大家介紹如何替場景中的物件寫程式碼,比方說我們要替場景中的風車物件製作選轉風車的動畫,如下圖。這時候你可以有兩種做法,第一種是用Animation的方式製作風車每個Frame旋轉多少,但這種做法較麻煩,如果以後要更改旋轉速度,又要重新製作Animation。

第二種做法是用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);
 }
}


寫好以後,就請將風車放到場景中吧,此時就能發現風車自動旋轉了!


留言