Platform: PC, Keyboard&Mouse
Technology: Unity, C#
Team size: 11 people (2 programmers, 2 sound design, 4 artists, 2 game designers, 1 narrative designer)
Project Duration: 3 months (May 2022- July 2022)
Design And Gameplay
Listen to Me is a pixel-style horizontal pop-up shooting ACT game, which is also a visualization of “roses” and “thorns” on the way of independent game production. Players play a childhood dream to become a game developer, feel the pressure of the environment from family, workplace, lovers, etc. on the way to growth, and still try to adhere to the game development dream.
Notable Contributions
1. Design and make a rougelike pseudo-random equipment drop probability system.
2.Designed and implemented the main interaction flow of the game.
3. Use art materials to create different character animations and animators for each level.
WeGame Store Page
https://www.wegame.com.cn/store/2008253/listen_to_me
Realtime Screenshots
Code Sample – Equipment pool system
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemPool : MonoBehaviour
{
private Subscription<DropItemEvent> drop;
//Increasing the drop probability of specific equipment
public int bonusMultiple=10;
//The equipment pool
[System.Serializable]
public class Pool
{
public int tag;
public int setNumber;
public int itemNumber;
public GameObject prefab;
public int Rarity;
}
public List<Pool> pools;
public GameObject[,] Equips;
private List<int> dropSetList;
private Transform[] dropPos;
private int dropSum;
private void Start()
{
drop =EventBus.Subscribe<DropItemEvent>(_drop);
Equips = new GameObject[17, 3];
for(int i = 0; i < pools.Count; i++)
{
Equips[pools[i].setNumber-1, pools[i].itemNumber-1] = pools[i].prefab;
}
}
private void _drop(DropItemEvent drop)
{
Debug.Log("DROP!!!");
dropSetList = drop.setNum;
dropPos = drop.dropPos;
dropSum = drop.dropSum;
List<Pool> droplist=new List<Pool>();
List<int> bonus = new List<int>();
foreach (var _pool1 in pools)
{
//Go through the equipment on the player,
//and add the items that need to increase the drop rate
//to the bonus list first based on the equipment on the player.
foreach (var item in Inventory.instance.items)
{
if (_pool1.tag == item.ItemNumber
&& !bonus.Contains(_pool1.setNumber)
&& dropSetList.Contains(_pool1.setNumber))
{
bonus.Add(_pool1.setNumber);
}
}
}
foreach (var _pool2 in pools)
{
//Add all possible equipment drops to the Drop Pool
//according to the Drop List for the level.
if (dropSetList.Contains(_pool2.setNumber))
{
for(int i = 0; i < _pool2.Rarity; i++)
{
droplist.Add(_pool2);
}
}
//Add items from the Bonus List to the drop pool
//according to the set bonus multiplier.
if (bonus.Contains(_pool2.setNumber))
{
for (int i = 0; i < _pool2.Rarity*bonusMultiple; i++)
{
droplist.Add(_pool2);
}
}
}
for (int i = droplist.Count-1; i > -1; --i)
{
//Remove from the drop pool any equipment
//that duplicates the equipment on the player.
if (Inventory.instance.items != null)
{
if (Inventory.instance.items.Contains
(droplist[i].prefab.GetComponent<ItemPickUp>().item))
{
droplist.Remove(droplist[i]);
}
}
}
GameObject[] dropItems = new GameObject[dropSum];
for(int i = 0; i < dropSum; i++)
{
dropItems[i] = droplist[Random.Range(0, droplist.Count)].prefab;
for(int j = 0; j < i; j++)
{
//Determine the actual equipment dropped,
//and reselect if the dropped equipment is duplicated.
if (dropItems[i] == dropItems[j])
{
i--;
break;
}
}
}
for (int i = 0; i < dropSum; i++)
{
Debug.Log(dropItems[i].name+" "+i);
Instantiate(dropItems[i], dropPos[i].position, Quaternion.identity);
}
}
private void OnDestroy()
{
Debug.Log("Destroy!!!!!!!!!!!");
EventBus.Unsubscribe(drop);
}
}