I Bee Xploring
An Mobile Infinite Runner game where you have to collect pollen and avoid obstacles. The game is set in a 3D world with a bee as the main character.
Project Info
- Engine:
- Unity Engine
- Language:
- C#
- Duration:
- 10 weeks (5 days/week)
- Type:
- Mobile Game
- Reason:
- Project for Birungi Studio
My Contributions
- ✓ Created a system for Player Damage Feedback.
- ✓ Fixed bugs in the game.
- ✓ Handled IOS beta testing.
Work In Progress
This project is currently still a work in progress. The project page will be updated as soon as there is more to show!
Showreel
This is the official trailer for 'I Bee Xploring'.
Gamescom '25
This year was my first year at Gamescom in Cologne, Germany. I did not know what to expect from the convention, or how it would be to work as a company at a convention instead of only being a guest, but it was so cool! I met so many new people, got to tell Birungi's story to hundreds of people and I've seen so many good and cool-looking cosplays. Being surrounded by a team I could call my friends is so nice, and the love of the craft all made this trip worth it. I've learned about how to properly communicate with customers, potential business partners and I got to listen to a few different game studio's stories and how they handle everything. I'd say that this trip was good for me personally, but also professionally.
Damage Feedback (rev. 1)
When the player takes damage, a visual feedback is shown on the screen to indicate the hit. The player gets bounced back, takes damage, stops moving for a brief moment and then recovers.
PlayerDamage.cs (csharp)
public class PlayerDamage : MonoBehaviour
{
[SerializeField] private float StartSpeed;
[SerializeField] private float Speed;
[SerializeField] private float negativeSpeed;
[SerializeField] private float Delay = 0.75f;
[SerializeField] private float SpeedChange = 75f;
[SerializeField] private float currentSpeed;
[SerializeField] private bool speedUp = false;
[SerializeField] private bool slowDown = false;
[SerializeField] public float _energyDrain;
[SerializeField] public float ogDrainValue;
[SerializeField] GameObject skin;
SphereCollider sphereCollider;
ChunkManager chunkManager;
StatsManager statsManager;
Player _player;
public UnityEvent OnHit;
void Awake()
{
_player = GameManager.Instance.GetService<Player>();
if (_player == null)
{
Debug.LogError("Player not found in GameManager.");
return;
}
sphereCollider = GetComponentInParent<SphereCollider>();
if (sphereCollider == null)
{
Debug.LogError("SphereCollider not found on parent object.");
return;
}
statsManager = GameManager.Instance.GetService<StatsManager>();
if (statsManager == null)
{
Debug.LogError("StatsManager not found in GameManager.");
return;
}
chunkManager = GameManager.Instance.GetService<ChunkManager>();
if (chunkManager == null)
{
Debug.LogError("ChunkManager not found in GameManager.");
return;
}
}
// Start is called before the first frame update
void Start()
{
StartSpeed = statsManager.GetStat("ChunkSpeed");
StartCoroutine(SetStartValues());
}
private IEnumerator SetStartValues()
{
yield return new WaitForSeconds(1.0f);
Speed = StartSpeed;
negativeSpeed = -Speed;
currentSpeed = Speed;
statsManager.SubscribeToStat("EnergyDrain", (value) => _energyDrain = value);
ogDrainValue = statsManager.GetStat("EnergyDrain");
}
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.layer != 10 && other.gameObject.layer != 11)
{
OnHit.Invoke();
sphereCollider.enabled = false;
StartCoroutine(imumityVisibility());
}
else
{
return;
}
}
public void ShotsFired()
{
currentSpeed = negativeSpeed;
SpeedController.Speed = currentSpeed;
statsManager.SetStat("ChunkSpeed", currentSpeed);
slowDown = true;
_player.Activate(false);
}
private IEnumerator DelayBeforeSpeedUp()
{
yield return new WaitForSeconds(Delay);
}
private IEnumerator imumityVisibility()
{
if (sphereCollider.enabled == true) yield break;
yield return new WaitForSeconds(0.25f);
skin.gameObject.SetActive(false);
yield return new WaitForSeconds(0.25f);
skin.gameObject.SetActive(true);
StartCoroutine(imumityVisibility());
}
void Update()
{
if (slowDown == true && currentSpeed <= 0)
{
_player.Invincible(true);
_energyDrain = 0f;
statsManager.SetStat("EnergyDrain", _energyDrain);
currentSpeed += SpeedChange * Time.deltaTime;
SpeedController.Speed = currentSpeed;
statsManager.SetStat("ChunkSpeed", currentSpeed);
}
else if (slowDown == true && currentSpeed >= 0)
{
currentSpeed = 0;
SpeedController.Speed = currentSpeed;
slowDown = false;
speedUp = true;
}
if (speedUp == true && currentSpeed < Speed)
{
_player.Activate(true);
currentSpeed += SpeedChange * Time.deltaTime;
SpeedController.Speed = currentSpeed;
statsManager.SetStat("ChunkSpeed", currentSpeed);
}
else if (speedUp == true && currentSpeed >= Speed)
{
speedUp = false;
sphereCollider.enabled = true;
StartCoroutine(DelayBeforeSpeedUp());
_player.Invincible(false);
statsManager.SetStat("EnergyDrain", ogDrainValue);
}
}
}
Player Damage Feedback
Visual representation of the player damage feedback.