Tailieu Unity3d

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 44

Ti liu hc Unity 3D

Unity l engine mnh trong lp trnh game 3d, v m phng h thng 3d, ng
thi Unity h tr xut ra trn mi h iu hnh di ng vi cc phin bn khc
nhau. Nhm pht trin game, v o to lp trnh vin unity v ha 3d ti
3dvietpro gii thiu vi cc bn bc u tin lm quen vi Unity:

I. Ci t v s dng cc i tng trong Unity

ci t cc bn vo: http://unity3d.com/ download phin bn free

Sau khi ci dt xong cc bn m chng trnh unity v ch cc hnh sau:

Hnh:

+ Scene: l giao din thit k game unity


+ Game: l giao din hin th chng trnh game unity
Hnh:

Tng ng vi 4 phm (Q,W,E,R), trong :


+ Q c biu tng bn tay gip bn dch chuyn v tr mn hnh
+ W dng la chn cc i tng, dch chuyn theo 3 hng x (mu ),
y( xanh lam), z(xanh da tri). Bn mun i tng dch chuyn theo 3 chiu khc
nhau ch vic click vo mi tn v ko theo chiu .
+ E dng xoay cc i tng theo cc hng khc nhau

+ Phm R ng ko i tng to hn hoc nh hn so vi kch thc

V d:

Thnh
Cc bn lm quen vi cc trc ta nh hnh di:

y l ta theo 3d, nu bn mun chuyn v ta 2d theo chiu chn


bn ch vic nhn vo t Persp pha di thnh.

Giao din tip theo ca Unity l Hierarchy: dng cha cc i tng cn


lp trnh trong Unity.
Bn c th to ra i tng bng cch nhn vo Create, trn mn hnh ang
ch vo i tng Cube. Mun tm i tng ny trong mn hnh thit k
(Scene) bn ch cn nhn phm F.

Giao din Inspector:

chnh l thuc tnh ca i tng unity, vi hnh trn trong bi ny 3dvietpro


ch cho cc bn bit v:
+ Position: v tr ca i tng theo 3 chiu x, y, z mc nh l 0
+ Rotation: V tr xoay ca i tng theo 3 chiu x, y, z, mc nh l 0
+ Scale: phng to thu nh i tng theo cc chiu x, y, z
Nu bn thay i ln xn cc v tr cc i tng unity bn ch cn nhn vo biu
tng bnh rng bn pha tay phi chn reset, tc l i tng s tr v trng
thi ban u.

Giao din Project:


Dng cha cc file lp trnh, m thanh, hnh nh, hiu ng, texture trong
unity.

Hng dn lm i tng di chuyn v nhy bng unity.

Hm nay mnh s hng dn cc bn mi hc unity mt bi kh n


gin v c bn trong vic hc unity, l iu khin mt tri bng di
chuyn cc hng v nhy ln bng bn phm.

Bc 1: cc bn to ra 1 qu bng v 1 mt phng qu bng c th


di chuyn trn

Cc bn nhn trn th Hierarchi c Create, cc bn vo v ln


lt chn Sphere( khi cu) v Plane (mt phng).

Cc bn c th Create thm Direction light khng gian sng


hn .
Cc bn ko trc ta Y qu cu nm trn mt phng.

Sau cc bn ko chiu di v chiu rng ca mt phng ra


ln hn qu bng c th di chuyn thoi mi bng cch chnh
thng s Scale ca Plane trong th Inspector.
Vy l cc bc chun b hon thnh.

Bc 2: qu bng di chuyn c, chng ta cn vit script cho n,


cc bn nhn trn th Project, chut phi vo Assets -> Create ->
C# Script ( y mnh dung ngn ng C#).
Mt Script mi s c to ra, cc bn t tn cho n. Mnh
t tn l move.Sau cc bn nhy p vo script, ca s
MonoDevelop s c m ra chng ra code trong .

Cc bn code nh sau:

Cu lnh rigidbody.Addfore gip ta y qu bng i vi 1 lc


theo 1 vector no .

Sau khi code xong cc bn n Ctrl+S lu li ri quay li ca s


Unity, dng chut ko file script (ca mnh l file move) vo i
tng Sphere (qu bng)
By gi th i tng Sphere c iu khin bng script
move.
Vy l ta xong phn vit lnh iu khin tri bng.

Bc 3. qu bng c th nhn lc tc dng vo th n phi c khi


lng, to khi lng cho qu bng, cc bn chn vo Add
component trong th Inspector ca Sphere. Cc bn chn Physics ->
Rigidbody.
By gi cc bn c th tng gim khi lng qu bng.
By gi bn th n play v s dng phm ln xung tri phi di
chuyn qu bng, phm cch nhy :D

Bc 4: qu bng p hn th ta nn to cho n 1 mu sc hay ha


tit g .

Cc bn ly nh ca 1 ha tit bt k m bn mun t cho qu bng,


sau ko n vo Assets ca th Project. Mnh chn ha tit caro.
Sau bn dng chut ko file th vo qu bng, vy l qu
bng c t mu, cc bn c th lm tng t vi Plane
to mt t p hn.
Vy l cc bn hon thin vic iu khin qu bng chy theo
cc hng v nhy.

2.3. To i tng cha, i tng con


(gii thch Position, locaposition), cch
ly i tng con trong cha
Trong unity vi cc cc bn c th to thnh nhm cc i tng bng
cch sau:

Bc 1: Click p vo i tng cn to i tng

Lu : Hnh ng click p gip bn chn ng i tng , v thao


tc ti v tr i tng c chn.

Hnh 2.3.1. Click p vo i tng ParentCam

Bc 2: Nhp phi chut chn mt i tng, nh hnh 2.3.1 ti to


i tng con l Main Camera.

Bc 3: Thc hin lnh sau:

// Khai bo bin

protected Transform pivot;

public Transform cam;

// Thc hin trong start


cam = GetComponentInChildren<Camera> ().transform;

pivot = cam.parent;

vi dng GetComponentInChildren<Camera> ().transform; ly


i tng camera, v t i tng camera chng ta ly c i tng
cha ca n l ParentCam.

Bc 4: K ng k mu xanh t i tng cha ti i tng con

void OnDrawGizmos()

if (pivot != null && cam != null)

Gizmos.color = Color.green;

Gizmos.DrawLine(pivot.position,
cam.transform.position);

Nh hnh:
Hnh 2.3.2. V tr t im cha ti im con

Tip theo chng ta tm hiu v Position, LocalPosition, cc bn


vi i tng ParentCam trn th cu lnh transform.Position th
hin v tr ca i tng trong ton b khng gian 3D
V d:

// thc hin di chuyn i tng ti ta (0, 0, 0)


transform.position = Vector3(0, 0, 0);

Vi LocalPosition c iu c bit, l chng ta dng xc nh v


tr ca i tng trong khng gian cha ca i tng.

V d trong i tng Camera hnh 2.3.2 th:

Hnh 2.3.3. V tr ca Camera trong i tng cha ParentCam

Nh vy chng ta hiu c v tr ca i tng cha v con, by gi


cc bn th lm mt bi tp ngc li nh sau:

Bi 2.3.1: T v tr cha ly tn ca i tng con, c th trong v d


2.3.1 th t v tr ParentCam cc bn tm cch ly tn ca Main
Camera hoc bt k mt i tng no trong ParentCam
2.8. Hm x l thi gian

2.8.1. S dng timescale

Trong qu trnh x l game unity bn khng th thiu hm x l thi


gian, nhm 3dvietpro gii thiu cc bn x l thi gian bng hm
timeScale

Bc 1: Cc bn to mt cube c gn rigidbody, v file lnh c cc


dng lnh bc 2

Bc 2: Code hin th

// Update is called once per frame

void Update () {

//Nhn nt Q thc hin timeScale

if (Input.GetKeyDown(KeyCode.Q))

if (statusBol == false)

Time.timeScale = 0.7f;

statusBol = true;

else if (statusBol == true)

{
Time.timeScale = 0.1f;

statusBol = false;

Time.fixedDeltaTime = 0.02f * Time.timeScale;

print("fixedDeltaTime:" + Time.fixedDeltaTime);

// Nhn phm Space di chuyn theo trc y

if (Input.GetKeyDown(KeyCode.Space))

transform.Translate(0,Time.deltaTime * Speed,0);

Khi bn nhn nt space khi box s di chuyn theo trc y, trong lc


khi box ri xung bn nhn phm Q, bn s thy khi box di chuyn
chm dn, nh vy hm timeScale c tc dng:

Vi Time.timeScale = 0.1f; // l thi gian thc hin ti


Vi Time.timeScale = 0f; // Thi gian s dng li
Vi Time.timeScale = 0.xxxxf; // Thi gian s chm li 2x so vi thi
gian thc
Tc dng ca vic s dng timeScale gm: pause game, s dng trong
hiu ng v di chuyn

2.8.1. S dng timescale thc hin pause mt game

void PauseGame (bool val)

if (val == false)

return;

if (Time.timeScale == 0f) {

Time.timeScale = 1f;

pause = false;

return;

} else {

Time.timeScale = 0f;

pause = true;

return;

Vi hm trn chng ta thc hin p vo i tng v gi


PauseGame(true) thng qua mt nt lnh th i tng s dng li do
thit lp timescale =0f, v bm nt li i tng tip tc c di
chuyn.
2.9. Lp trnh AI & h ta

Vi v d sau cc bn c th nh hng ng i ca mt i tng


qua cc im c nh du cho trc bng cch s dng thut ton
AI:

Bc 1: To 1 file .js p vo i tng cn di chuyn

var spawnPoint:Transform;

//Mng bao gm cc phn t im c nh du

private var waypoint=new Array();

private var dau:float;

private var j:int=0;

var Gtext:GUIText;

private var veloc;

private var ktr:boolean;

private var t:float=0.0;

var vt: float = 5f;

function Start(){

var i=0;

//Ly tt c cc im con trong im cha

for(var child:Transform in spawnPoint){


waypoint[i]=child;

i++;

function Update () {

//ly v tr t im u ti cc im c nh du

dau=Vector3.Distance(transform.position,waypoint[j].position);

var relvitePos=waypoint[j].position-transform.position;

var gtr :Vector3;

//Xoay i tng ti v tr im tm thy

var rotation=Quaternion.LookRotation(relvitePos);

transform.rotation=Quaternion.Slerp(transform.rotation,rotation,Time.d
eltaTime*2);

//Dch chuyn i tng

transform.Translate(Vector3.forward *Time.deltaTime * vt);

//Ly v tr tip theo ca im cn dch ti

if(dau<=1){

j++;

//Kim tra xem im nh du ti im cui cng cha


th quay li im 0

if(j>=waypoint.length){
j=0;

Bc 2: To cc im c nh du

Hnh 2.9.1. To im nh v cho i tng chuyn ng

Bc 3: Sp xp t im cho i tng cn di chuyn ti


Hnh 2.9.2. nh du cc im

Bc 4: p cc im c nh du vo mng waypoint c khai


bo trn

Hnh 2.9.3. p im cha cha cc im nh du vo tp lnh

Bc 5: Chy chng trnh


Th vy qua v d ny cc bn to c chng trnh AI chuyn
ng cho bt k i tng no trn mn hnh. Cc bn c th pht
trin thm tng qua bi tp ny nh:

Bi 2.9. Thc hin va chm cc i tng theo lnh AI nh trn, dng


li di chuyn khi i tng va chm v to hiu ng va chm.

3. Hng dn lm chuyn ng Oto


3D
Chng trnh lm t 3D chuyn ng c ng dng nhiu trong cc game ua
xe 3D, ngoi ra lm chuyn ng t 3d trn a hnh c ng dng vo trong lnh
vc m phng nh cc bi tp li xe, kim tra cc thit b ca ng c. Trong phn
ny nhm 3DVietpro trnh by vi cc bn cc bc to mt t 3D chuyn ng.

Bc 1: Cc bn vo phn Asset ca unity tm kim t kha sau Toturial car v


download v my ca mnh v chy chng trnh:
Hnh 4.1.1. Giao din chng trnh ua xe t c import t Asset Unity

Bc 2: Cc bn tch m hnh Oto trong hnh 4.1 ra mt project ring, thc hin
tch cc bn lu vn sau:
- Vo th mc gc ca project tm n \Assets\Models\Car
- Xut hin file Materials v catamount.fbx, cc bn thc hin ko vo ca s
Project ca project mi to. Trong Materials l map ca t, cn fbx l m hnh
3D ca t.
Bc 3: Khi thc hin ko t hin th khng c mu sc, cc bn click vo cc
phn ca Oto s hin hnh nh di:
Hnh 4.1.2. Thnh phn ca t c gn map

Nu phn Material trong hnh trn khng c, th cc bn tm trong th mc Materials va Import ph hp.

Hnh 4.1.3. La chn bnh xe pha trc bn tay tri


Hnh 4.1.4. Tch bnh xe

Bc 4: Click p vo bnh xe, sau vo Game Object chn Create Empty, khi
chn xong bn s thy xut hin mt im nm trung tm bnh xe v chnh l
im Game Object va ri bn to.

Bc 5: t tn cho i tng Game Object trong Bc 4 , nh hnh 4.1.3. Chng


ta t l WheelFL_col

Bc 6: Click vo WheelFL_col trong phn Inspector chn Add Component tm


n Wheel Collider, khi bn la chn s hin th nh sau:

Hnh 4.1.6. Wheel Collider c la chn


Hnh 4.1.7. Hnh sau khi c la chn xong, vch mu xanh chnh l Wheel Collider

Bc 7: Bn thc hin tng t nh cc bc 4,5,6 vi cc bnh xe cn li

Bc 8: Vit lnh cho bnh xe chuyn ng bng cch to ra mt file C#, sau
bn ko vo chic xe.
- Chng ta khai bo dng lnh sau l Public

// Bin thc hin lm chuyn ng bnh xe


public Transform WheelFL;
public Transform WheelFR;
public Transform WheelRL;
public Transform WheelRR;

//Bin thc hin lm chuyn ng Collider


public WheelCollider WheelFL_col;
public WheelCollider WheelFR_col;
public WheelCollider WheelRL_col;
public WheelCollider WheelRR_col;

- Khai bo tc v gc quay bnh trc ca xe

public float speed =40f;


public float angle=60f;

- thc hin lm chuyn ng, nh thc t cho thy l chng ta phi dng lc y 2 bnh sau i v bnh trc
ch c nhim v quay gc lm bnh li cho xe chy theo cc hng c iu khin. Cc bn vit hm sau trong
Update:

WheelRL_col.motorTorque = speed * Input.GetAxis("Vertical");


WheelRR_col.motorTorque = speed * Input.GetAxis("Vertical");
//WheelFL_col.motorTorque = speed * Input.GetAxis("Vertical");
//WheelFR_col.motorTorque = speed * Input.GetAxis("Vertical");

- To gc quay cho bnh trc

WheelFL_col.steerAngle = angle * Input.GetAxis ("Horizontal");


WheelFR_col.steerAngle = angle * Input.GetAxis ("Horizontal");

- Trong Update cc bn vit thm hm sau quay bnh xe:

WheelRL.Rotate (speed*Input.GetAxis("Vertical"),0,0);
WheelRR.Rotate (speed* Input.GetAxis("Vertical"),0,0);
WheelFL.Rotate (speed*Input.GetAxis("Vertical"),0,0);
WheelFR.Rotate (speed * Input.GetAxis ("Vertical"), 0, 0);

V chnh xc vi tc quay chng ta c th thay bin speed bng dng lnh sau:

WheelFL_col.rpm/60*360

- bnh trc c th lm bnh li chng ta dng dng lnh sau:

WheelFL.localEulerAngles = new Vector3(WheelFL.localEulerAngles.x,


angle * Input.GetAxis("Horizontal"), WheelFL.localEulerAngles.z);

WheelFR.localEulerAngles = new Vector3(WheelFL.localEulerAngles.x,


angle * Input.GetAxis("Horizontal"), WheelFL.localEulerAngles.z);

Th l chng ta vit lnh chuyn ng cho bnh xe, by gi cc bn ch cn gn cc i tng Public cho cc
bin c khai bo v chy chng trnh:
Hnh 4.1.8. Ko cc i tng vo cc bin ca xe 3D
Bc 9: Kt qu chy

Nh vy trong phn ny nhm 3dvietpro hng dn cc bn lm xe chuyn


ng bng cch s dng Wheel Collider. Cc bn lu mt s thuc tnh sau ca
Wheel Collider:
1. motorTorque : To ng lc cho bnh xe
2. steerAngle : To gc cho bnh

ly vn tc ca xe cc bn thc hin lnh sau:

rigidbody.velocity.magnitude * 3.6f

Vn tc * thi gian (3.6f) = S km/h


4. S dng v di chuyn camera
Cc hm thng s dng:
+ LookAt: Hng camera theo v tr cn nhn
LookAt(Transform target, Vector3 worldUp = Vector3.up);
VD:
public Transform target;
void Update() {
transform.LookAt(target);
}

+ fieldOfView: iu chnh tm nhn ca Camera, thc hin iu chnh, chng ta s


dng dng lnh sau:

Camera.main.fieldOfView = <Bin kiu s>;


VD:
Camera.main.fieldOfView = <Bin kiu s>;

+ LookRotation: Dng xoay gc nhn ca camera ti mt gc nhn khc theo vng


quay c tnh ton.

VD:
public Transform target;
void Update() {
//xc nh hng cn xoay ti
Vector3 relativePos = target.position - transform.position;
// s dng hm LookRotation a ra vng cn quay
Quaternion rotation = Quaternion.LookRotation(relativePos);
// di chuyn camera theo vng quay c tnh
transform.rotation = rotation;
}

+ Slerp: di chuyn gc nhn t From ti to vi vn tc c a ra

public static Quaternion Slerp(Quaternion from, Quaternion to, float t);

VD:
public Transform from;
public Transform to;
public float speed = 0.1F;
void Update() {
transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time *
speed);
}

Chng trnh trnh by:


a i tng vo unity, thc hin gn map, lp trnh i tng chuyn ng v di
chuyn camera:

5. S dng chm mn hnh


TouchCount

GetTouch(0).phase

TouchPhase
+ Began: Ngn tay chm vo mn hnh

+ Moved: Di chuyn ngn tay trn mn hnh

+ Stationary: Ngn tay chm vo mn hnh v khng thc hin di


chuyn
+ Ended: Ngn tay ri khi mn hnh, chm kt thc

+ Canceled: H thng thot ch chm

VD 1:

for (var i = 0; i < Input.touchCount; ++i) {

if (Input.GetTouch(i).phase == TouchPhase.Began)

VD 2:

int nbTouches = Input.touchCount;

if(nbTouches > 0)

for (int i = 0; i < nbTouches; i++)

Touch touch = Input.GetTouch(i);

TouchPhase phase = touch.phase;

switch(phase)

case TouchPhase.Began:

print("New touch detected at position " + touch.position + " ,


index " + touch.fingerId);

break;
case TouchPhase.Moved:

print("Touch index " + touch.fingerId + " has moved by " +


touch.deltaPosition);

break;

case TouchPhase.Stationary:

print("Touch index " + touch.fingerId + " is stationary at


position " + touch.position);

break;

case TouchPhase.Ended:

print("Touch index " + touch.fingerId + " ended at position "


+ touch.position);

break;

case TouchPhase.Canceled:

print("Touch index " + touch.fingerId + " cancelled");

break;

Tnh tc ca chm

S dng detatime tnh ton v di chuyn tc ca ngn tay

float touchSpeed = touch.deltaPosition.magnitude / touch.deltaTime;

Ly v tr ca mn hnh

Vector3 position =
Camera.main.ScreenToWorldPoint(touch.position);
tapCount

if (Input.touchCount > 0) {

Debug.Log("ONE TAP");

if(Input.GetTouch(0).tapCount == 2)

Debug.Log("DOUBLE TAP");

Input.acceleration

S dng lc mn hnh theo chiu nh (Chiu x, y) tng t khi


chng ta s dng Horizontal v vertical trong unity thay cho chiu x,
y khi chng ta dng acceleration

Cc s dng:

VD 1:

int tiltDirection = Input.acceleration.x > 0 ? 1 : -1;

thisTranfrom.position = new Vector3( Mathf.Clamp(thisPosition.x,-


2.4f,2.4f),thisPosition.y,thisPosition.z);

vi Input.acceleration.x cc bn lc mn hnh theo chiu ngang, v


Input.acceleration.y dng lc mn hnh theo chiu dc.

6. S dng s kin cho UI


6.1. S dng p trc tip cc s kin

1. To ra ra cc i tng Button v Image nm trong canvas


2. a tp lnh vo i tng Image

3. T Component chn Event Trigger

4. Chn Add New Event Type> PointerEnter thc hin vic hover
chut, hay Chm vo i tng
Trong :

PointerEnter: Kch hot khi chng ta hover ln i tng

PointerExit: Kt thc vic hover

5. Thm s kin bng cch clicks vo du (+), b mt s kin click vo


du (-)

6. Ko i tng Image c gn tp lnh vo s kin


7. Vit lnh code trn tp lnh

8. La chn No Function trong phn 6 chn phng thc ChangColor

l phng php chng ta x l trn i tng c gn tp lnh


bt cc s kin, trong phn 6.2 cc bn bit thm mt phng php
mi s dng trc tip cc s kin m khng cn thao tc bng tay.

6.2. S dng lnh p trc tip cc s kin

Trong phn ny cc bn to ra Tp EventTest gn vo i tng Image

1. Khai bo th vin UnityEngine.EventSystem, thc hin p vic k


tha n lp ,IPointerEnterHandler, IPointerExitHandler
Cho tp cc bn cn bt s kin

2. Trong phn khai bo cc bn khai bo nh sau


private AudioClip audioclip;
private AudioSource audiosource;

3. Trong phn start chng ta ly i tng m thanh

Trong button_hover_sound l tn file ca m thanh nm trong th mc


Resources
void Start () {
audioclip = Resources.Load<AudioClip>("button_hover_sound");
gameObject.AddComponent<AudioSource>();
audiosource = gameObject.GetComponent<AudioSource>();
}
3. Chng ta vit ra 2 s kin sau
public void OnPointerEnter(PointerEventData evendata)
{
mouseOnCount = mouseOnCount + 1;
Debug.Log(mouseOnCount);
audio.PlayOneShot(audioclip);
}
public void OnPointerExit(PointerEventData eventdata)
{
Debug.Log("exitPointer");
}

Lu OnPointerEnter v OnPointerExit cc bn phi vit chun, bin


mouseOnCount dng m s ln hover

4. Chy dng trnh, tp lnh ny cc bn gn vo i tng cn thc


hin

6.3. To Skidmark cho xe car

Bc 1: To 2 bin sau
public ParticleEmitter Effect_L;
public ParticleEmitter Effect_R;
public Transform skidmark;

Vi Effect_L, Effect_R l hiu ng khi


Skidmark l i tng vch c to
C th nh hnh nh:
Bc 2: To ra phng thc BrakeSkidMark
Vi tham s truyn vo l Status

Bc 3: Trong Upadate vit Phm ngt (Space)


Bc 4: cho chy chng trnh

Ngun
3Dvietpro

You might also like