--- //[[admin@puov2.gementar.com|Hilmi]] 2022/08/01 17:28//
====== Football Minigame ======
{{ :wiki:fsmm.gif?nolink |}}
This is the finished Minigame for football side minigame in Explore Module!
====== Prototyping ======
{{ :wiki:image_2022-08-02_002932464.png?nolink&600 |}}
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 ======
{{ :wiki:fsm.gif?nolink |}}
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 ======
{{ :wiki:football.gif?nolink |}}
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.
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().velocity = Vector3.zero;
//Stop rotating
ball.GetComponent().angularVelocity = Vector3.zero;
createCone();
}
public bool getFootBallStatus()
{
return ballDetected;
}
private List newItemList = new List();
[Button]
public void createCone()
{
if (newItemList != null)
{
foreach (var item in newItemList)
{
Destroy(item);
}
}
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.SetParent(cone);
newItem.transform.position = newPos;
newItemList.Add(newItem);
}
}
}