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

Hilmi 2022/08/01 17:28

Football Minigame

Finsihed Minigame

This is the finished Minigame for football side minigame in Explore Module!



This is the prototype scene of football side minigame, The target of this side minigame people can interact and play it without trying to score.
This time I'll using auto/modular cone placement.

State Machine

Finite State Machine

If ball detected in goal net it will fireup action state, it will play feedback, particle, audio, and reset those cone and ball.

State Machine

Automatic cone placer (Dynamic/Modular) Cone respawn

So I create a area with a drawable Gizmos, 

Gizmos.DrawWireCube(cone.transform.position, new Vector3(rangeX , 3, rangeZ));

I draw the gizmos at parent location with random rangeX and rangeZ, so as you can se above the RED line is the range I draw.

The blue one shows that I'm using random location at random point ex (0,1) (1,0) from the location.
Everytime user scored it will reset and set 6 cone at random location.

Full Script

using Sirenix.OdinInspector;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class FootBallMiniGame : MonoBehaviour
    public ParticleSystem particle;
    public bool ballDetected = false;
    public Transform ballResetPosition;
    public Transform ball;
    public GameObject conePrefab;
    public Transform coneGizmo;
    public float rangeX = 5f;
    public float rangeZ = 5f;
    private void Start() => createCone();
    public void playParticle() => particle.Play();
    public void footBallDetected() => ballDetected = true;
    public void footBallLossDetection()
        ballDetected = false;
    private void OnDrawGizmos()
        Transform cone = coneGizmo.transform;
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(cone.transform.position, new Vector3(rangeX, 3, rangeZ));
        float x = UnityEngine.Random.Range(cone.transform.position.x, cone.transform.position.x);
        float z = UnityEngine.Random.Range(cone.transform.position.z, cone.transform.position.z);
        float randX = UnityEngine.Random.Range(-rangeX, rangeX);
        float randZ = UnityEngine.Random.Range(-rangeZ, rangeZ);
        Gizmos.color = Color.blue;
        float xZ = cone.transform.position.x + (int)Math.Round((decimal)randX) / 2;
        float zZ = cone.transform.position.z + (int)Math.Round((decimal)randZ) / 2;
        Gizmos.DrawWireCube(new Vector3(xZ, cone.transform.position.y, zZ), new Vector3(1, 1, 1));
    public void resetBall()
        ball.transform.position = ballResetPosition.position;
        //Stop Moving/Translating
        ball.GetComponent<Rigidbody>().velocity = Vector3.zero;
        //Stop rotating
        ball.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
    public bool getFootBallStatus()
        return ballDetected;
    private List<GameObject> newItemList = new List<GameObject>();
    public void createCone()
        if (newItemList != null)
            foreach (var item in newItemList)
        for (int i = 0; i < 6; i++)
            Transform cone = coneGizmo.transform;
            float randX = UnityEngine.Random.Range(-rangeX, rangeX);
            float randZ = UnityEngine.Random.Range(-rangeZ, rangeZ);
            float x = cone.transform.position.x + (int)Math.Round((decimal)randX) / 2;
            float z = cone.transform.position.z + (int)Math.Round((decimal)randZ) / 2;
            var newPos = new Vector3(x, cone.transform.position.y, z);
            var newItem = Instantiate(conePrefab, this.gameObject.transform);
            newItem.transform.position = newPos;

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