Welcome to GEMENTAR TOUR PUO V2 Development Documentation. Enjoy your stay!

Hilmi 2022/07/25 16:42

Class Diagram

Class Explanation

Search System Controller

Full Script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Sirenix.OdinInspector;
using System.Linq;
using TMPro;
 
#region Code Information
/*
    This script is used for System Controller
    First of all we need bangunanList -> ScriptableObject List
    menuList -> Menu Prefabs
    contentGameObject -> to make the prefab as child
    instantiatedGameObject List to take notes of instantiated gameobject to destroy it later.
 
 */
#endregion
 
public class SearchSystemController : MonoBehaviour
{
 
 
    public List<Bangunan> bangunanList;
    public GameObject menuList;
    public GameObject contentGameObject;
    private List<GameObject> InstantiatedGameObject;
 
    public TMP_InputField textInput;
 
    private void Start()
    {
        InstantiatedGameObject = new List<GameObject>();
        ShowList(bangunanList);
        RefreshList();
    }
 
    private void Update()
    {
        if(Input.anyKeyDown && !textInput.Equals(""))
        {
            if (Input.GetKey(KeyCode.Mouse0) || Input.GetKey(KeyCode.Mouse1))
            {
                return;
            }
            else
            {
                DeleteList();
                Search();
            }
        }
    }
 
    public void Search() // Search by using C# contains
    {
        List<Bangunan> searchedBangunan = new List<Bangunan>();
        foreach (var item in bangunanList)
        {
 
            string nameList = (item.namaBangunan + item.namaPenuhBangunan + item.maklumatKedua + item.maklumatPertama).ToLower();
            string searchText = textInput.text.ToLower();
 
            if (nameList.Contains(searchText) == true)
            {
                searchedBangunan.Add(item);
            }
        }
 
        ShowList(searchedBangunan);
    }
 
    // ------------------------------------------------------    SHOW & DELETE SYSTEM --------------------------------------------------
    private void ShowList(List<Bangunan> bangunanChoosen)
    {
 
        foreach (var item in bangunanChoosen)
        {
            GameObject newList;
 
            newList = Instantiate(menuList, new Vector3(323.265f, -319.235f, 0), Quaternion.identity);
            newList.transform.SetParent(contentGameObject.transform);
 
            newList.transform.Find("Label_Ribbon01_Group/Label_Ribbon01/Building Name").gameObject.GetComponent<TextMeshProUGUI>().SetText(item.namaBangunan, 3.5f);
            newList.transform.Find("Building Full Name").gameObject.GetComponent<TextMeshProUGUI>().SetText(item.namaPenuhBangunan, 3.5f);
            newList.transform.Find("Course/Course List").gameObject.GetComponent<TextMeshProUGUI>().SetText(item.maklumatPertama, 3.5f);
            newList.transform.Find("Class/Class List").gameObject.GetComponent<TextMeshProUGUI>().SetText(item.maklumatKedua, 3.5f);
 
            newList.GetComponent<ButtonLerpToBuilding>().bangunan = item;
 
            InstantiatedGameObject.Add(newList);
        }
    }
 
    public void DeleteList()
    {
        if (InstantiatedGameObject.Count == 0) return;
        foreach (var item in InstantiatedGameObject)
        {
 
            Destroy(item);
        }
    }
 
    [Button("RefreshList")]
    public void RefreshList()
    {
 
        DeleteList();
        ShowList(bangunanList);
    }
 
 
}

Public Void Search()

 
This method is used to search certain keyword that contains in building list string text, It will detect all of building name, description. 
we use C# .Contains() method to check if any keyword contains in string.

Public Void Delete()

 
This method is used to destroy instantiated item, since we instantiate the UI GameObject to make it dynamically update, we need to handle the deletion every time it's update.

Public Void RefreshList()

 
Refresh method calls Delete() and ShowsList(), this come in handy when want to refresh those list.

Building Interact

Full Script

using Sirenix.OdinInspector;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
 
public class BuildingInteract : MonoBehaviour
{
    public enum SenaraiBangunan
    {
        _1_pusat_islam = 0,
        _2_anjung_premier = 1,
        _3_cisec = 2,
        _4_dewan_jka = 3,
        _5_hep = 4,
        _6_JKM_D_JKA = 5,
        _7_PEJABAT_PENTADBIRAN = 6,
        _8_JMSK = 7,
        _9_DEWAN_WARISAN = 8,
        _10_STUDENT_CENTRE = 9,
        _11_GALERI_PUO = 10,
        _12_FUTSAL_CAMPUS_A = 11,
        _13_BENGKEL_MEKANIKAL = 12,
        _14_BENGKEL_AWAM = 13,
        _15_PERPUSTAKAAN = 14,
        _16_DEWAN_JUBLI = 15,
        _17_JMSK_D_JKM = 16,
        _18_BENGKKEL_AKM = 17,
        _19_JKP = 18,
        _20_CAFE_JKE = 19,
        _21_JTMK = 20,
        _22_JKE = 21
    }
 
    [Title("TEXT INPUT")]
    public TMP_InputField tmp;
    [Title("HOLO MATERIAL")]
    public Material holoMaterial;
    public GameObject bangunanChild;
    [SerializeField]
    [EnumToggleButtons]
    [Title("SENARAI BANGUNAN")]
    private SenaraiBangunan senaraiBangunan;
 
    private Bangunan bangunan;
    private List<Bangunan> bangunanList;
 
 
    private void Start()
    {
        bangunan = new Bangunan();
        bangunanChild = new GameObject();
        bangunanList = GameObject.Find("Building List Control").GetComponent<SearchSystemController>().bangunanList;
        bangunan = bangunanList[(int)senaraiBangunan];
 
 
        Debug.Log("Bangunan " + bangunan.namaBangunan);
 
        instantiateNewHologram();
        setActiveHide(false);
    }
 
    public void openSearch()
    {
        var button = GameObject.Find("Button_Building_List").GetComponent<OpenCloseUI>();
        button.openObjet();
 
        tmp.text = bangunan.namaBangunan;
        GameObject.Find("Building List Control").GetComponent<SearchSystemController>().DeleteList();
        GameObject.Find("Building List Control").GetComponent<SearchSystemController>().Search();
        GameObject.Find("Camera Rig").GetComponent<CameraController>().gotToVector3(bangunan.xLocation,bangunan.zLocation);
    }
 
 
    private void instantiateNewHologram()
    {
        var newItem = Instantiate(this, this.transform.position, this.transform.rotation);
        bangunanChild = newItem.gameObject;
        bangunanChild.transform.localScale += new Vector3(0.01f, 0.01f, 0.01f);
        bangunanChild.transform.SetParent(this.transform);
        Destroy(bangunanChild.GetComponent<BuildingInteract>());
        bangunanChild.layer = LayerMask.NameToLayer("Default");
        bangunanChild.GetComponent<Renderer>().material = holoMaterial;
 
    }
 
    public void setActiveHide(bool x)
    {
        bangunanChild.SetActive(x);
    }
}

openSearch()

 
This method is used to open button game object and start searching when user click the building

instantiateNewHologram()

 
Create hologram when mouse pointed - it will duplicate object set as child and increase size to 0.01

setActiveHide(bool x)

 
active and deactive hologram object

Camera Controller

Full Script

using Micosmo.SensorToolkit;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
#region Code Information
/*
    This script is for cammeracontroller
    prettymuch self explainatory
 
    OPENCLOSEUI.UIOPENED IS USED TO DETERMINE IF THERE'S ANY UI OPEN
 
    gotovector3() <-- called to set location elsewhere.
 
 */
#endregion
 
public class CameraController : MonoBehaviour
{
 
    public float movementSpeed;
    public float movementTime;
    public float rotationSpeed;
    public Vector3 scrollSpeed;
 
    public Transform AttachedCamera;
 
    public Vector3 newPosition;
    public Vector3 newCameraPosition;
 
    public Quaternion newRotation;
 
    private RaySensor sensor;
 
    // Start is called before the first frame update
    void Start()
    {
 
        sensor = GetComponentInChildren<RaySensor>();
        buildingSelected = new GameObject();
 
        newPosition = transform.position;
        newRotation = transform.rotation;
        newCameraPosition = AttachedCamera.localPosition;
    }
 
    private void FixedUpdate()
    {
        HandleMouseMovementInput();
        HandleMovementInput();
    }
 
    public void gotToVector3(float x, float z)
    {
        newPosition = new Vector3(x, this.transform.position.y, z);
    }
 
    void HandleMovementInput()
    {
        if (OpenCloseUI.UIopened != true)//DETERMINE IF THERE'S ANY UI OPEN
        {
            if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
            {
                newPosition += (transform.forward * movementSpeed);
            }
 
            if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
            {
                newPosition += (transform.forward * -movementSpeed);
            }
 
            if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
            {
                newPosition += (transform.right * -movementSpeed);
            }
 
            if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
            {
                newPosition += (transform.right * movementSpeed);
            }
 
            if (Input.GetKey(KeyCode.Q))
            {
                newRotation *= Quaternion.Euler(Vector3.up * -rotationSpeed);
            }
 
            if (Input.GetKey(KeyCode.E))
            {
                newRotation *= Quaternion.Euler(Vector3.up * rotationSpeed);
            }
 
            if (Input.GetAxis("Mouse ScrollWheel") > 0f || Input.GetKey(KeyCode.Z)) // forward
            {
                if (newCameraPosition.y > 20) newCameraPosition += scrollSpeed;
            }
 
            if (Input.GetAxis("Mouse ScrollWheel") < 0f || Input.GetKey(KeyCode.X)) // backwards
            {
                if (newCameraPosition.y < 60) newCameraPosition -= scrollSpeed;
            }
        }
 
        AttachedCamera.localPosition = Vector3.Lerp(AttachedCamera.localPosition, newCameraPosition, Time.fixedDeltaTime * movementTime);
        transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, Time.fixedDeltaTime * movementTime);
        transform.position = Vector3.Lerp(transform.position, newPosition, Time.fixedDeltaTime * movementTime);
 
    }
 
    void HandleMouseMovementInput()
    {
        var ray = GetComponentInChildren<Camera>().ScreenPointToRay(Input.mousePosition).direction;
        sensor.Direction = ray;
 
        if (OpenCloseUI.UIopened != true)//DETERMINE IF THERE'S ANY UI OPEN
        {
 
            if (Input.GetKey(KeyCode.Mouse0))
            {
                if (detected == true)
                {
                    buildingSelected.GetComponent<BuildingInteract>().openSearch();
                }
            }
        }
    }
 
    bool detected;
    public GameObject buildingSelected;
    public void DetectBuilding()
    {
        var detectedItem = sensor.GetDetectionsByDistance();
 
            buildingSelected = detectedItem[0];
            buildingSelected.GetComponent<BuildingInteract>().setActiveHide(true);
            detected = true;
    }
 
    public void DetectLostBuilding()
    {
        buildingSelected.GetComponent<BuildingInteract>().setActiveHide(false);
        detected = false;
    }
}

goToVector3(float x, float z);

 
This method for outside of class to manipulate camera rig position

HandleMovementInput();

 
This method will be call by fixed update to handle WASD camera movement.

HandleMouseMovementInput()

 
This method is to handle mouse movement input by using raycast. This is how we detect building to select it.

DetectBuilding()

 
This method will be called by Ray EVENT gameobject, it will fireup this method when it detect building.

DetectLostBuilding()

 
This method will be called by Ray EVENT gameobject, it will fireup this method when it lost detect the selected building

Bangunan (SCRIPTABLE OBJECT)

Full Script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Sirenix.OdinInspector;
 
#region Code Information
/*
   This is a scriptable object. make sure to put x/z location to the pivot of camera Rig
 */
#endregion
 
[CreateAssetMenu(fileName = "DataBangunan", menuName ="Data Bangunan")]
public class Bangunan : ScriptableObject
{
    [BoxGroup("Informasi Bangunan")]
    public string namaBangunan;
    [BoxGroup("Informasi Bangunan")]
    [TextArea]
    public string namaPenuhBangunan;
    [BoxGroup("Informasi Bangunan")]
    [TextArea(15, 50)]
    public string maklumatPertama;
    [BoxGroup("Informasi Bangunan")]
    [TextArea(15, 50)]
    public string maklumatKedua;
 
    public float xLocation;
    public float zLocation;
}

Button Lerp To Building

Full Script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using System;
 
#region Code Information
/*
    This script is for button lerp to building.
    So we will get ScriptableObject Bangunan from SearchSystemController iteration
    and use building location values to lerp into the preferred location
 */
#endregion
 
public class ButtonLerpToBuilding : MonoBehaviour
{
    public Bangunan bangunan;
 
    public void LerpToBuilding()
    {
        FindObjectOfType<CameraController>().gameObject.GetComponent<CameraController>().gotToVector3(bangunan.xLocation, bangunan.zLocation);
    }
}

LerpToBuilding()

 
When this method called it will lerp to the destination given (axis x and z)


QR Code
QR Code wiki:class_diagram (generated for current page)
Hello World!
DokuWiki with monobook... rules!