Anda di halaman 1dari 17

DESAIN GRAFIS DASAR

JOB SHEET 13 KONTROL ANIMASI, MECANIM, DAN


SCRIPTING

Mata Kuliah : Dasar Pemrograman


Dosen : Liliek Triyono, S.T, M.Kom
Disusun oleh
Nama : Sandy Rio Pratama
NIM : 4.33.20.1.22

PROGRAM STUDI TEKNOLOGI REKAYASA KOMPUTER


JURUSAN TEKNIK ELEKTRO
POLITEKNIK NEGERI SEMARANG
2020
Kontrol Animasi, Mecanim & Scripting

Tujuan :
1. Mengenalkan mahasiswa metode skelatal
2. Memberikan pengalaman mahasiswa memanage animasi game2D
3. Memberikan pengalaman mahasiswa memadukan animasi game2D
4. Mengajarkan mahasiswa mengendalikan animasi dengan Script C#
5. Memberikan pengalaman mahasiswa untuk mengontrol object animasi berdasar
inputan
Alat :
1. Perangkat Laptop/PC
2. Unity 2020.1.15f1 Personal
3. Asset Anima2D
4. Ms Visual Studio 2019
Materi :

Mecanim

Dalam bab ini, kita akan menggunakan alat Mecanim Unity yang sangat bagus untuk
dipasangkan dengan animasi yang sudah disiapkan sebelumnya, dan kita akan menambahkan
beberapa script sederhana untuk hasil akhir.

Kita sudah memiliki animasi yang lengkap dan akan kita buat animasi tersebut
bertautan/berhubungan satu sama lain yang akan menkitakan rangkain kemungkinan gerakan.
Jadi, tujuan awal kita adalah untuk menghubungkan klip animasi yang berbeda dan
menyatukan mereka bersama-sama. Untuk ini, Unity menyediakan alat yang mengagumkan
yang disebut Mecanim. Mecanim adalah sistem animasi yang kuat dan fleksibel. Karena
terintegrasi dengan Unity sendiri, tidak membutuhan perangkat lunak pihak ketiga. Kita
dapat dengan mudah membuat animasi apa saja, dari sprite memadukan bentuk atau bahkan
mengatur cahaya. Mecanim memungkinkan Kita untuk membuat state machines dan blend
trees untuk mengontrol karakter Kita. Tapi, sebelum kita melangkah lebih jauh, mari kita
bicara sedikit tentang memadukan animasi dan state machines sehingga Kita akan memiliki
pemahaman yang lebih baik.

Apa yang dimaksud dengan State Machine?

Di Unity, kita dapat memadukan dua atau lebih gerakan serupa- contoh, kita mungkin ingin
memadukan animasi berlari dan berjalan semua tergantung pada kecepatan karakter. Pada
dasarnya, Kita memiliki dua cara yang berbeda untuk memadukan animasi di Unity.
Dalam beberapa situasi kita mungkin ingin menggunakan Transisi; di situasi lain kita perlu
menggunakan Blend Trees:

Transisi digunakan untuk mentransisikan dengan lancar antara animasi. Hal ini
biasanya bekerja dengan baik jika transisi cepat.

 Blend trees memungkinkan beberapa animasi yang akan dicampur dengan baik,
ketika menggabungkan bagian-bagian dalam jumlah yang bervariasi. Jumlah ini
dikendalikan oleh parameter numerik.

Untuk memberikan contoh praktis, bayangkan bahwa kita memiliki game shooter; kita
mungkin ingin karakter menembak dan berjalan pada waktu yang sama. Blend trees
memungkinkan kita untuk memadukan dua animasi bersama-sama, membiarkan karakter
berlari dan menembak pada saat yang sama, tanpa perlu membuat animasi ketiga. Sebuah
state machines menyimpan state suatu entitas pada waktu tertentu, dan dapat bereaksi
terhadap masukan untuk mengubah state entitasnya, atau menyebabkan suatu tindakan atau
output.

Dalam Unity, kita menggunakan state machines untuk mengontrol keadaan karakter.
Misalnya, state machines agar karakter bisa berjalan, dan lompat. Karakter dapat berubah
dari keadaan berjalan ke keadaan lompat berdasarkan masukan dari pemain (menekan tombol
lompat). Di sini kita dapat melihat contoh (lebih kompleks) state machines dari dokumentasi
Unity. Setiap kotak mewakili state machines, dan panah merupakan kemungkinan
transisinya:
Kita akan membuat state machines dengan animasi yang ada, dan kemudian menggunakan
transisi untuk memadukan mereka bersama-sama.

Animator adalah sebuah FSM (Finite State Machine) yang mengatur bagaimana perubahan
state animasi milik sebuah objek terjadi. Sebuah Animator akan menghubungkan berbagai
Animation Clip dalam diagram pohon. Seorang programmer/visual artist dalam Unity
kemudian memiliki kebebasan untuk mengarahkan bagaimana Animation Clip ini terhubung,
serta apa urutan kejadiannya. Lebih lanjut bahkan Animation Clip ini bisa di-trigger melalui
script jika dibutuhkan.

Detail : https://docs.unity3d.com/Manual/AnimatorControllers.html

Langkah Percobaan membangun state machines :

1. Buka jendela Animator

Untuk membuat State machines kita lihat project yang pernah kita buat pada pertemuan
sebelumnya. Buka Control Animasi (Animator) dengan klik Window | Animation |
Animator.

Jendela Animator akan ditampilkan sejumlah animasi yang ada pada Animator Controller
pada object yang sama, kali ini objectnya adalah kesatria. Jadi kesatria punya animasi apa
saja akan ditampilakan pada jendela tersebut, seperti Animasi Idle, Jalan, Lari, Lompat,
Menunduk, Serang. Sendangkan secara default Unity memberikan 3 buah state lain Entry,
Any State dan Exit. Entry state digunakan untuk awal dari semua tindakan ketika Unity di
jalanakan. Selain itu, terdapat juga state Any State , yang berarti Finate State Machine bisa
berpindah ke sebuah state dari state manapun, saat terjadi trigger tertentu.
2. Membuat transisi State Default

Animasi yang dilakukan unity akan sangat berpengaruh pada tautan dari tiap state, jika tidak
didefinisikan dalam Animator, maka transisi dari tiap animasi tidak akan mungkin terjadi.
Setiap game dijalankan akan dimulai dari state Entry dan Transisi akan menuju ke Default
State Transition. Setiap state bisa menjadi default state transition, untuk membuat State
menjadi default bisa dilakukan klik kanan state yang akan dijadikan default | Set as Layer
Default State.

3. Membuat transisi antar State

Transisi antar state ini dibutuhkan untuk mengaitkan dari satu animasi ke animasi lain,
dengan asumsi jika parameter yang digunakan sesuai maka akan dilakukan animasi sesuai
dengan settingan sebelumnya. Misal dari animasi Idle menjadi animasi Jalan, jika parameter
dari Idle terpenuhi maka akan dijalankan Animasi Jalan.
Caranya : Klik kanan pada state | Make Transition | Klik kiri pada State tujuan
4. Tambahkan parameter yang digunakan untuk menentukan state mana yang akan
dijalankan. Jadi dengan mengeset transisi antar state pada step sebelumnya dan
membuat parameter ini akan dilihat dan dijalankan. Parameter | pilih tanda + | pilih
Int | beri nama State | isi parameter dengan nilai 0.

5. Set semua transisi yang ada, dengan bilangan integer untuk referensi animasi.
Setting tiap transisi yang ada dengan nilai parameter, misal dari idle ke jalan :
Klik pada tanda panah idle  jalan | maka akan muncul kotak dialog inspector |
Conditions ( +) | isi dengan nilai 1 | Hilangkan centang Has Exit Time.

Hilangkan Centang Loop Time untuk menghilangkan perulangan animasi dengan Klik 2 kali
pada animasi | Hilangkan cetang pada Loop Time.

Setelah selesai setting coba jalankan dan rubah nilai parameter untuk merubah animasi sesuai
dengan settingan yang ada dalam tabel.
No Transisi Nilai State pada Conditions
1. Idle  jalan 1
2. Jalan  idle 0
3. Idle  loncat 2
4. loncat  idle 0
5. Jalan  loncat 2
6. Lari  jalan 1
6. OK! Tiba saatnya untuk membuat script untuk mengubah nilai parameter. Pertama
buat folder Scripts pada File Project Assets | klik kanan | Create | Folder | beri
nama Scripts.

Drag & Drop kontrolkarakter.cs dan pada object karakter Maka scripts akan
otomatis muncul pada dialog Inspector.
Edit Script tersebut dengan mengklik dua kali file scriptnya(KesatriaController). Secara
default ketika menginstall Unity kita sudah mendapatkan Editor MonoDevelop sekalian
untuk mengedit Script C#. Atau jika punya VisualStudio kita bisa tambahkan sebagai editor
default.
Kode program default untuk tiap class yang diterbitkan dalam Unity akan mengandung fungsi
Start() dan Update().

Fungsi Start() : Digunakan untuk inisialisasi atau pengenalan object yang dilakukan saat game
dijalakan.
Fungsi Update() : Digunakan untuk aktifitas utama yang akan diupdate setiap frame per
second(fps).

Script yang dibutuhkan untuk kontrol karakternya:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KesatriaController : MonoBehaviour
{
public float lompat;
public float walkSpeed = 1; // player left right walk speed
public float runSpeed = 5;
private bool _isGrounded = true; // is player on the ground?
Animator animator;
Rigidbody2D rb2d;
//some flags to check when certain animations are playing
bool _isPlaying_JALAN = false;
//animation states - the values in the animator conditions
const int STATE_IDLE = 0;
const int STATE_JALAN = 1;
const int STATE_LARI = 2;
string _currentDirection = "right";
int _currentAnimationState = STATE_IDLE;
void melompat()
{
GetComponent<Rigidbody2D>().velocity = new Vector2(0,
lompat);
}
void Start()
{
//define the animator attached to the player
animator = this.GetComponent<Animator>();
rb2d = this.GetComponent<Rigidbody2D>();
}
// FixedUpdate is used insead of Update to better handle
thephysics based jump
void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
melompat();
}
else if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * runSpeed
*Time.fixedDeltaTime,Space.Self);
changeState(STATE_LARI);
}
else if (Input.GetKey("right"))
{
changeDirection("right");
transform.Translate(Vector3.right * walkSpeed
*Time.fixedDeltaTime,Space.Self);
if (_isGrounded)
changeState(STATE_JALAN);
}
else if (Input.GetKey("left") )
{
changeDirection("left");
transform.Translate(Vector3.right * walkSpeed
*Time.fixedDeltaTime,Space.Self);
if (_isGrounded)
changeState(STATE_JALAN);
}
else if (Input.GetKey("right"))
{
changeDirection("right");
transform.Translate(Vector3.right * walkSpeed
*Time.fixedDeltaTime,Space.Self);
if (_isGrounded)
changeState(STATE_JALAN);
}
else if (Input.GetKey("left"))
{
changeDirection("left");
transform.Translate(Vector3.right * walkSpeed
*Time.fixedDeltaTime,Space.Self);
if (_isGrounded)
changeState(STATE_JALAN);
}
else
{
if (_isGrounded)
changeState(STATE_IDLE);
}
if
(animator.GetCurrentAnimatorStateInfo(0).IsName("jalan"))
_isPlaying_JALAN = true;
else
_isPlaying_JALAN = false;
}
//--------------------------------------
// Change the players animation state
//--------------------------------------
void changeState(int state)
{
if (_currentAnimationState == state)
return;
switch (state)
{
case STATE_JALAN:
animator.SetInteger("State", STATE_JALAN);
break;
case STATE_LARI:
animator.SetInteger("State", STATE_LARI);
break;
case STATE_IDLE:
animator.SetInteger("State", STATE_IDLE);
break;
}
_currentAnimationState = state;
}
//--------------------------------------
// Check if player has collided with the floor
//--------------------------------------
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.name == "Ground")
{
_isGrounded = true;
changeState(STATE_IDLE);
}
}
//--------------------------------------
// Flip player sprite for left/right walking
//--------------------------------------
void changeDirection(string direction)
{
if (_currentDirection != direction)
{
if (direction == "right")
{
transform.Rotate(0, 180, 0);
_currentDirection = "right";
}
else if (direction == "left")
{
transform.Rotate(0, -180, 0);
_currentDirection = "left";
}
}
}
}
Script yang dibutuhkan untuk kontrol kamera:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class kamera : MonoBehaviour


{
public GameObject Player;
public float JarakPandang;
// Start is called before the first frame update
void Start()
{

// Update is called once per frame


void Update()
{
Vector3 pos = new Vector3(Player.transform.localPosition.x
+ Player.transform.localPosition.x * JarakPandang, 0, -10f);
transform.localPosition =
Vector3.Slerp(transform.localPosition, pos, 0.025f);

}
}

Anda mungkin juga menyukai