Thursday, May 7, 2015

Material(Basic) pada Unity

Material digunakan untuk memberikan visualisasi pada mesh, seperti misalnya Diffuse, Normal, Specular. Biasanya material dibuat pada software eksternal seperti 3dsmax, maya, blender. Namun dari unity sendiri sebenarnya kita juga bisa membuat material kita sendiri.
Contoh :
1.      Lakukan create material


2.      Klik material yang baru dibuat


Secara default maka jenis material yang akan terpilih adalah material jenis diffuse. Yaitu material yang hanya mampu menerima texture gambar yang bisa langsung dilihat oleh user(base). Contoh selain diffuse yang digunakan adalah Bumped Diffuse (base, normal), Bumped Specular (base, normal, specular). Dalam contoh akan menggunakan Bumped Diffuse. Berikan texture base dan normal. Untuk menghasilkan normal kita dapat mengimport gambar apa saja kemudian pada setting asset tersebut kita ubah dari texture menjadi normal. Normal digunakan untuk membuat efek timbul pada material, sedangkan specular digunakan untuk menentukan penyerapan cahaya pada material.

Navigation Mesh pada Unity Engine

Navigation mesh adalah salah satu fitur yang ada pada unity yang digunakan untuk melakukan pathfinding, yaitu fitur untuk melakukan pencarian jalan secara otomatis untuk memudahkan programmer sebagai pengganti dari metode algoritma A*.
Cara untuk menggunakan navigation mesh, pertama kita harus melakukan bake pada menu Window>Navigation, pada gameobject yang mau kita jadikan wilayah untuk dilakukan pencarian, game object harus dalam mode static





 Setelah melakukan bake(dalam contoh pada sebuat cube besar) maka akan terlihat warna biru seperti berikut, yang artinya NavMesh sudah tergenerate dengan benar.
Langkah-langkah tadi adalah bertujuan untuk melakukan prekalkulasi path, bagi yang melakukan explorasi(misalkan player) agar dapat memanfaatkan navmesh maka player sebagai game object harus memiliki komponen Nav Mesh Agent


Berikan Script PlayerController seperti berikut pada game object player

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {
    private Vector3 targetPosition;
    private NavMeshAgent navMeshAgent;
    void Awake() {
        navMeshAgent = GetComponent<NavMeshAgent>();
    }
    void Update() {
        //melakukan raycast pada tile melalui mouse untuk menentukan posisi tujuan player
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100)) {
            Debug.Log(hit.point);
            targetPosition = hit.point;
        }

        //menggunakan navmeshagent untuk menentukan arah jalan dari player untuk mencapai tujuan
        navMeshAgent.SetDestination(targetPosition);
        transform.position = transform.position + navMeshAgent.desiredVelocity * Time.deltaTime;
    }
}



Lakukan hover pada lantai menggunakan mouse selama game berjalan, navMeshAgent akan menentukan arah berjalan yang harus dilalui.


Simple minecraft Build System pada Unity Engine


Requirement : Sudah memahami basic unity
             














Diatas adalah texture yang akan dipakai dalam contoh game kita

            Buatlah material diffuse untuk masing-masing dari 3 texture diatas, atau cara mudahnya adalah buat 3 quad dalam scene kemudian drag and drop texture yang sudah diimport ke masing-masing quad


Hubungkan semua quad menjadi 1 bentuk cube 6 face seperti gambar dibawah, dan masukkan semua ke sebuat gameobject parent dengan nama DirtCubes, kemudian jadikan sebuat prefab, rename masing-masing facenya, perhatikan arah kompas utama, pastikan bahwa hadapannya adalah x ke kanan, z ke depan dan y ke atas.


Perbanyak instance dari Dirt Cube hingga membentuk lantai yang cukup.
Import package character controller untuk menggunakan FirstPerson mode.


Berikan sebuah script baru dengan nama PlayerController pada game object FirstPersonController, dengan isi sebagai berikut

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{

    RaycastHit hit;
    Transform cam;
    public GameObject dirtCube;
    public GameObject dirtCubeSample;
    void Awake()
    {
        cam = Camera.main.transform;
    }
    void Start()
    {
        //untuk sebelum versi 5.0.1p2
        //Screen.showCursor = false;
        //setelah versi 5.0.1p2
        Cursor.visible = false;
    }
    void Update()
    {
        Vector3 addedDistance = Vector3.zero;
        if (Physics.Raycast(cam.position, cam.forward, out hit, 500f))
        {
            if (hit.collider.gameObject.name == "Top")
            {
                addedDistance = new Vector3(0, 1, 0);
                dirtCubeSample.gameObject.transform.position = hit.collider.transform.parent.position + addedDistance;
            }
            if (hit.collider.gameObject.name == "Bottom")
            {
                addedDistance = new Vector3(0, -1, 0);
                dirtCubeSample.gameObject.transform.position = hit.collider.transform.parent.position + addedDistance;
            }
            if (hit.collider.gameObject.name == "Left")
            {
                addedDistance = new Vector3(-1, 0, 0);
                dirtCubeSample.gameObject.transform.position = hit.collider.transform.parent.position + addedDistance;
            }
            if (hit.collider.gameObject.name == "Right")
            {
                addedDistance = new Vector3(1, 0, 0);
                dirtCubeSample.gameObject.transform.position = hit.collider.transform.parent.position + addedDistance;
            }
            if (hit.collider.gameObject.name == "Front")
            {
                addedDistance = new Vector3(0, 0, -1);
                dirtCubeSample.gameObject.transform.position = hit.collider.transform.parent.position + addedDistance;
            }
            if (hit.collider.gameObject.name == "Back")
            {
                addedDistance = new Vector3(0, 0, 1);
                dirtCubeSample.gameObject.transform.position = hit.collider.transform.parent.position + addedDistance;
            }
        }
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            if (addedDistance != Vector3.zero)
                GameObject.Instantiate(dirtCube, hit.collider.transform.parent.position + addedDistance, Quaternion.identity);
        }
    }
}


Variable dirtCube mengambil object untuk inisialisasi dari prefab cube
Variable dirtCubeSample mengambil object dari salah satu cube pada scene, dan collider khusus pada 1 object ini di nonaktifkan.



Hasil akhir seperti gambar dibawah

Penggunaan Raycasting pada Unity Engine


Raycasting merupakan cara untuk melakukan pengecekan dengan menggunakan suatu garis lurus yang tidak terlihat untuk mendapatkan object apa saja yang ada di depannya dan dimanakah titik collision yang mengenai Ray.
Berikut beberapa metode raycast yang sering digunakan :

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {
    public float DistanceToGround { get; set; }

    void Update() {
        RaycastHit hit;
        if(Physics.Raycast(transform.position, -Vector3.up, out hit))
        {
            DistanceToGround = hit.distance;
        }
    }
}

Penggunaan raycast dari transform.position dari misalkan player. –Vector3.up memiliki value (0,-1,0) yang berarti kearah bawah.  out hit merupakan cara untuk mengirim suatu variable secara reference pada C#. pada kasus diatas digunakan untuk mengetahui berapakah jarak antara player ke tanah.


using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {
    public float DistanceToGround { get; set; }

    void Update() {
        RaycastHit hit;
        if(Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0f))
        {
            DistanceToGround = hit.distance;
        }
    }
}

Sama dengan contoh sebelumnya, namum pada contoh kali ini terdapat parameter tambahan yaitu 100.0F, yang berarti jarak pengecekan maksimal pada raycast adalah 100 unit. Bila lebih dari itu maka tidak akan terdeteksi. Salah satu kegunaannya adalah untuk pengaplikasian pistol dalam game, dimana rata-rata game yang menggunakan pistol sebenarnya tidak benar-benar meng-spawn object peluru, namun dengan cara memperlihatkan efek percikan dekat pistol, dan dengan menggunakan raycast untuk menentukan dimanakah akan mucul bekas decals. Dan biasanya terdapat jarak batas terjauh untuk senjata-senjata tertentu. Jarak pendeteksian yang terlalu jauh juga akan memiliki impact terhadap performa sendiri.

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {
    void Update() {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100)) {
            Debug.DrawLine(ray.origin, hit.point);
        }
    }
}

Pada contoh ini pengambilan Ray adalah melalui kamera, atau view kita sebagai player. Digunakan dalam kondisi kita hendak menentukan dimanakah mouse klik kita akan mendarat pada game world. Seperti contoh pada game Dota, kita melakukan klik kanan pada mouse, kemudian raycast akan menentukan dimanakah titik tujuan yang kita maksud dengan menggunakan kalkulasi lebih kurang seperti code ini.