Easy Suspension – Make car move in Unity

前言

我們在使用Unity製作車子模型的時候,其實最希望的就是可以自由地操作車子,並有物理現象的操作汽車就像在玩賽車遊戲一樣,本篇的重點就是用最簡單的方式就可以完成這項看似有困難的汽車場景。

從下圖可以看到我們可以讓車子自由的操作且輪子也會跟著碰撞物的物理現象而產生震動的感覺,是不是很有趣呢?

這次的練習我們使用國外網友所分享的 Easy Supension 插件來製作

Easy Supension 下載連結: https://t.co/Fcf7fg7lWl?amp=1

  1. 首先我們下載好以後開啟 Easy Supension 的資料夾,匯入到Unity以後可以看到Demo用的Package檔案,直接打開即可看到原本設定的方塊車子以及預設的場景等等。

我們先無腦測試一下,直接按下Play就可以看到方塊的車子操作起來也是相當的有趣。

2. 了解了Demo中的方塊汽車怎麼運作已後我們來開始利用 Easy Supension 插件製作自己的車子讓他跑起來。

首先我們從上方選單點選Vehicles並下拉選擇Boxy car wizard,這時候可以看到出現了一個小的視窗可以製作方塊汽車,我們就利用插件的功能來製作與模型相近數值的Boxy car。

建立好方塊車子以後我們將想要使用插件的汽車模型丟到方塊車子的Prefab裡面,因為建立好的Wheel Collider位置以及大小都與我們的車子不相同,這邊就要做一點苦工將 Wheel Collider 的位置以及大小依照我們的汽車模型進行調整。

這邊注意因為我們是使用插件的關係,所以我們暫時還不需要用到原本汽車模型裡面的車輪模型。

調整好以後我們來設定車輪的Shape,我們選擇CarRoot物件以後可以看到有兩個語法插件,我們將輪子的模型拖曳到CarRoot Rear Wheal Drive裡的Wheel Shape裡面就可以利用插件幫我們將車輪Render出來使用。

設定好以後我們按下Game Play,這個插件的能力有夠強大! 跑起來其實看起來已經很像已經完成了,對於一個新手在Unity對於汽車控制不知從何而入,這個插件可以說是相當的方便。

但是很快的我們就發現了這個插件的Bug,因為當初作者在製作此語法的時候單純只是把一個車輪的物件當作四個輪子使用,所以我們可以清楚的看到所有的車輪都是朝同一個方向的,這樣對於車子來講是相當的不合理。

3. 因為出現了車輪的問題所以我們要從與法理面修正,我可從CarRoot裡找到RearWhealDrive的語法,找到後開啟語法的檔案並進行修改。

我們可以在語法裡面找到wheelShape的位置藏在哪裡,並針對ws.tramsform.parent的部分進行修改。

我們在w.transform.parent = wheel.transform;底下增加以下的語法

if (wheel.transform.localPosition.x > 0f)
                {
                    ws.transform.localScale = new Vector3(ws.transform.localScale.x * -1f, ws.transform.localScale.y, ws.transform.localScale.z);
                }

這樣就可以告訴程式如果localPosition.x>0的話就要ws.transform.localScale.x * -1f

如果大家找不到位置的話可以直接複製以下全部的語法直接覆蓋即可。

using UnityEngine;
using System.Collections;

public class RearWheelDrive : MonoBehaviour {

	private WheelCollider[] wheels;

	public float maxAngle = 30;
	public float maxTorque = 300;
	public GameObject wheelShape;

	// here we find all the WheelColliders down in the hierarchy
	public void Start()
	{
		wheels = GetComponentsInChildren<WheelCollider>();

		for (int i = 0; i < wheels.Length; ++i) 
		{
			var wheel = wheels [i];

			// create wheel shapes only when needed
			if (wheelShape != null)
			{
				var ws = GameObject.Instantiate (wheelShape);
				ws.transform.parent = wheel.transform;
                //轉變輪子方向
                if (wheel.transform.localPosition.x > 0f)
                {
                    ws.transform.localScale = new Vector3(ws.transform.localScale.x * -1f, ws.transform.localScale.y, ws.transform.localScale.z);
                }
            }
		}
	}

	// this is a really simple approach to updating wheels
	// here we simulate a rear wheel drive car and assume that the car is perfectly symmetric at local zero
	// this helps us to figure our which wheels are front ones and which are rear
	public void Update()
	{
		float angle = maxAngle * Input.GetAxis("Horizontal");
		float torque = maxTorque * Input.GetAxis("Vertical");

		foreach (WheelCollider wheel in wheels)
		{
			// a simple car where front wheels steer while rear ones drive
			if (wheel.transform.localPosition.z > 0)
				wheel.steerAngle = angle;

			if (wheel.transform.localPosition.z < 0)
				wheel.motorTorque = torque;

			// update visual wheels if any
			if (wheelShape) 
			{
				Quaternion q;
				Vector3 p;
				wheel.GetWorldPose (out p, out q);

				// assume that the only child of the wheelcollider is the wheel shape
				Transform shapeTransform = wheel.transform.GetChild (0);
				shapeTransform.position = p;
				shapeTransform.rotation = q;
			}

		}
	}
}

修正好以後我們按下Game Play後可以看到我們原本右邊相仿的車輪已經被修正了。

4. 最後因為我們在控制車子的時候會發現攝影機並沒有跟著汽車在跑,這樣讓我們無法知道我們控制的車子到底跑到哪裡了,這邊的方法非常的簡單。

我們只要在Camera裡面新增Follow Target以及Look At Constraint 並將Target跟Source使用車子的模型讓攝影機follow 即可完成第三人稱的遊戲視角。

按下Game Play可以看到攝影機跟著汽車在跑了,這樣控制汽車才會像真的在控制,如果大家對於角度有自己的喜好的話也可以調整攝影機的角度。

小節

利用 Easy Supension 插件的效果可以輕易地控制車子並產生輪胎的轉動以及物理效果真的是相當令人幸奮的事情,這個方始可以快速地運用在測試的場景當中,如果要製作更多的汽車物理現象,這個插件可以說簡單好上手,是不是相當的方便呢?

參考資料: https://www.youtube.com/watch?v=BG7UMUWojik&t=182s

Easy Suspension: https://twitter.com/AnthonyYakovlev/s…

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *