Rollcore was one of my very first games that I have made and was created as part of one of my assignmrnts during my studies on creative media and production (Games Development). This game consists of a singular ball that the player controls and explores a vast world filled with landmarks, enemies, healthpacks and more!
During the development of this game, I didnt think nor know too much about how "good" the game works nor looks, I just wanted to practise and create however the outcome was more satisfying and celebratory that I have anticipated, making me proud of my first game I created and motivating more to explore this career and what kind of amazing new ideas and titles I could either make myself or help make within a team.
I do eventually intend to "remaster" and recreate this game in a more appealing and optimised fashion with a debut to more abilities and possible areas/landmarks. (Keep your eye out for that!)
Rollcore is a game about a player controlling a ball in a low poly world, encountering various enemies to combat them and collecting keys to unlock new exciting areas and vibrant biomes (such as a desert, snow, volcano etc with all having their unique set of enemies and appearance) with personalised environmental features for example the desert containing sinkholes that slow the player in as well as lava that slowly depletes the players health. Each biome consists of a temple somewhere hidden deep within their designated biome. Each temple has a different characteristic that is themed around their respective biome which further builds on the atmosphere of the world and deeper endures the player into the world.
Enemies will be spread around the world, causing disruption to the player and proving themselves to be an obstacle to the player. Enemies will come in different appearances and sizes depending on their habitat, for instance enemies that are located in the plains biome (the first biome that the player will encounter) will have a basic design of a goblin as goblins are seen as a common enemy design that is somewhat weak so therefore it will be the most basic and easiest enemy to defeat due to it being in the first biome of the game. Different types of enemies will have different attributes such as Health/Speed/Karma etc…
Temples are a type of structure that includes rooms with enemies and puzzles such as mazes and logic puzzles that are required to proceed deeper into the Temple. If you are brave enough to venture deep within the temples, you are bound to encounter a strong enemy called a virus, they serve the glitched entity (the nemesis of the player) by protecting the ability that the virus contains. Once encountering the arena that houses a virus, the virus will start attacking the player by following them and using abilities to try to eliminate the player. Eliminating viruses will allow the player to obtain the virus's ability and slowly starts to weaken the frontier to the glitched biome which houses the temple that holds the doors to the final boss, The Glitched Entity.
Deep exploration- Explore Biomes such as the plain lands, dessert Zaraibiak, Snowy Tundras and more! Temples can be found in each biome featuring puzzles and mazes for the player to explore and solve to reach the final arena of the temple. Each biome and area is contained by a frontier blocking them from the player; however the environments start to blend in when a next locked area separates the player from a new biome, this hints that a new biome is behind the locked area, making priorities for the player. Each biome will have their own personality and atmosphere, as well their own set of enemies that will be housed within the biome, setting the scene for the player and making them engage with the world.
Combat and Strategy- not every enemy is the same, each type of enemy can be stronger and faster than others, increasing the variety of challenge and strategy. There are various ways the enemies can be eliminated by the player, the intended way is to collide the player with the enemies weak face however there will be other ways the enemy can be eliminated for example by using the ability Impulse Shockwave to deal AOE damage which will be useful in difficult situations. Enemies will have a coded boundary that suggests its proximity range, when the player is within that range, the enemy will start to move towards the player. Eliminating enemies successfully will deal Karma damage to you and therefore will start to deplete your health but not your armour, so the player is required to explore the world to find Matrix Health to replenish the lost health. Each temple will contain a virus miniboss, each virus will have a special ability that they will take advantage of to defeat the player, once defeated by the same rules from collision and past collected abilities, the player can obtain the virus's power to aid them with their quest.
Puzzle Solving- Around the world, the player might come across some puzzles during gameplay. These puzzles may consist of mini mazes or logic puzzles that include a “one way” solution. Completing puzzles may contain items that help the players quests by augmenting their stats such as health/armour/damage etc. Puzzles will be most common within Temples and grant enemies as rewards so that the player can collect their temple keys to unlock more parts to the Temple and eventually reach the core of the temple to the Virus.
Epic Abilities- Viruses in temples will use their own abilities, gifted by the glitched entity, to try to defeat the player, once defeated the player can hold their abilities for their own use. The abilities can help the player by giving them buffs like speed and invincibility, there will also be an ability that will allow the player to use fast travel to get around the map faster and finally an AOE attack. Cooldowns will be present depending on which ability is used apart from the fast travel. The teleport ability (fast track), will only allow the player to teleport the player to biome shrines that have been discovered and activated. Biome shrines are small structures that only have use if you have the ability to fast travel and will have no cooldown.
Story Telling- The story consists of a glitched entity that has reeked havoc all over the world and is in an attempt to corrupt the whole world. The glitched entity has 4 abilities that were gifted to 4 different viruses. With the abilities contained within the viruses, they spread around the world, spreading glitched enemy forces all over the biomes which caused frontiers to be built that segregated biomes from each other. The viruses housed themselves deep within their temples. A player, you, is tasked to fight the glitched entity’s forces and using their dropped keys to break the frontiers between biomes and neutralise the viruses. After every virus is defeated, the frontier between the world and the glitched dimension where the glitched entity waits for you.
The world of rollcore will contain multiple biomes such as a plains biome, a desert biome, a snow biome, a volcanic biome as well as a glitched dimension that the player will explore and defeat enemies in. Each biome will have their own unique atmosphere and personality, each also housing unique enemies with their appearance matching their habitat. Deep within each biome, temples can be found that contain the path to a virus through combat and puzzle solving, containing puzzles and obstacles throughout the temple. Each temple will have unique characteristics that match their biome. For example, in the desert biome, the temple will be within a pyramid and in the volcano biome, the temple will be below the lake etc.
The story of rollcore consists of a glitched entity, reeking havoc and chaos onto the world and its once peaceful and vibrant biomes. The entity shared its power amongst 4 other entities called viruses the abilities consisted of dashing, invincibility, teleportation and shockwaves. The viruses then created frontiers that block the player from accessing, placing energy within various enemies that contain the keys to destroying said frontiers.
The player, you, is tasked to roam around the corrupted world, combatting enemies with the help of your abilities and the skill to get their keys, neutralise the corruption by defeating the temple's viruses scattered deep within each biome and gaining the abilities that will assist on your journey to neutralise the glitched entity.
The main mechanics will be implemented as abilities however there are some side mechanics, listed below:
Common mechanics:
-Rolling a ball to traverse the world and its biomes it has to offer
-Colliding into enemies weak faces will eliminating them
-Eliminating enemies successfully will drop a collectible, which can be used to unlock new areas
-Matrix Dust heals the player when collected (replenishes after a while)
-Unlocking new areas and biomes requires keys for further exploration to reach temples
-Enemies will start to follow the player if the player is on the proximity boundary
-Viruses use abilities to attack the player and defending themselves
-Player can obtain abilities from defeating viruses
Ability Mechanics:
-Impulse Shockwave will eliminate any enemy in the AOE attack
-Teleporting allows fast travel across the different biomes
-Dashing allows a temporary speed boost for the player, making exploring more efficient
-Invincibility granted temporarily to help with combat (can block karma)
Locked Areas
The first idea that I wanted to try and implement is the feature of unlocking areas if you have a certain score. My idea is using two scripts, the player script and a new script. In the new script I want to define how much score you would need to be able to unlock an area, using two scripts will be useful as I can amend how much score each barrier would need with no additional code.
My idea was to initially set the isTrigger option to false at the first frame, then using the OnColliderEnter() method and filter using CompareTag("Barrier") to run a block of code when the player collides with the barrier. The block of code will check if the score is equal to or bigger than the cost and if true, it will change isTrigger() to true and therefore the ball can go through the barrier and destroy it, making a particle effect to show that it has been unlocked. The image below shows a flowchart and the order of all the processes that will happen for this idea to be successfully implemented into the prototype. Flowcharts are useful to plan procedures and envision them in your head, it is commonly used for project planning.
I wanted to display the remaining score (which will be referred to as "energy"). The new processes are shown by the yellow region on the updated flowchart above. I plan to improve the Locked areas by displaying the difference between the current players energy and the required amount of energy to unlock an area as it will assist the player to know how much more energy is needed to unlock an area rather than just guessing how much energy unlocking a certain area is needed.
Enemies + Proximity
For the combat system, I wanted to provide enemies with a proximity area so that if the player is in the proximity of the enemy, the enemy would start chasing the player. I had the idea of having multiple Collison boxes on the enemy by using the parent/child feature of unity. The parent class will be an empty game Object with the script that checks if the player is in the proximity range of the range and if so, it will trigger a method to be executed in the enemy script that will allow the enemy entity to follow the player.
I had to research how the enemy would follow the player if the player comes into contact with the enemies proximity, to help me implement enemies following, I would need a public Game Object reference for a target (that being the player), then I can use the MoveTowards() operation that will help the enemy move towards the player. I needed 3 arguments to use MoveTowards() which were the objects position, the targets position and the speed. As the object position would be the enemies position, I can use tranform.position to get the enemies position as well as Target.transform.position that will get the players position and finally use EnemySpeed*Time.deltaTime to get the speed of the movement. Time.deltatime is used to give us a smoother movement as the use of deltaTime will make the game frame independent and therefore will run the same speed, no matter what the frames per second is.
The ability icons are the icons that can be found on the top right part of the image above, these icons are made from me and created with the help of Krita. Each icon has some correspondence to their ability that they represent (for example, The Invincibility Ability icon has a forcefield around the ball to represent defense). Each ability icon has their unique keybind to show the player what keybind is the action to activate a certain ability, however the teleport ability has no keybind as it will eventually be designed to open up a map of the game showing all the shrines that the player can teleport to. Once activating an ability, I want to use the gray icon (can be found in the top right of the image) to cover the ability and paste a countdown onto the gray icon to indicate how long until the player can use the ability again. The assets found on the bottom left of the image will tell the player which biome they are currently in. The bottom right asset holds my final design of the prototypes Heads Up Display. Containing a slot for ability icons, the health/ armor/ score of the player as well as what biome the player is in. I wanted to maximise the amount of information that the player is given however also try to balance how much the player can see (gameplaywise).
public class RollyBall : MonoBehaviour
{
Rigidbody rb;
private Vector3 grav=new Vector3(0,-50f,0);
Vector3 moveDirection;
public GameObject ForceField;
public GameObject ImpulseEffect;
public GameObject DamageTaken;
public GameObject MoreHealth;
private bool ShowDamage=false;
private int ShowDamageCount;
public float moveSpeed=10f;
public GameObject explosionPrefab;
public GameObject MatrixParticle;
public GameObject Impulse;
private GameObject DestroyImpulse;
public int scoreValue;
private int Difference;
public GameObject AugmentParticle;
public GameObject Portal;
public GameObject PortalText;
private bool ShowPortalText;
private int ShowPortalTextCount;
public Text scoreText;
public Text HealthText;
public Text ArmourText;
public Text COOLDOWN;
public bool ShowCooldown;
public int ShowCooldownCount;
public int check;
bool TriggerState;
public int PlayerHealth;
public int PlayerArmour;
public int MaxHealth;
public int MaxArmour;
public int Damage;
public bool ImpusleCooldownBool=false;
public int ImpusleCoolCount=0;
public int ImpulseCountDown=60*60;
public bool ImpulseShown=false;
public bool ImpulseActive=false;
private int ForceFieldCount=10;
private int ForceFieldShowCount;
public int InvincCoolCount=0;
public int InvincCountDown=60*60;
public bool InvincCooldownBool=false;
public bool InvincActive=false;
public bool SpeedCooldwonBool=false;
public int SpeedCoolCount=0;
public int SpeedCountdown=60*30;
public bool SpeedActive=false;
public float NormalSpeed=1f;
public float AbilitySpeed=0.5f;
private bool TeleportActive;
public GameObject DashCD;
public GameObject ImpulseCD;
public GameObject InvincCD;
public Text DashCooldownText;
public Text ImpulseCooldownText;
public Text InvincibilityCooldownText;
public Text TeleportText;
public bool DashObtained=false;
public bool ImpulseObtained=false;
public bool InvincibilityObtained=false;
public bool TeleportObtained=false;
public int duration=600;
public Text CostNeeded;
private bool CostCheck;
private int CostCheckCount;
private int StoreHealth;
private bool inLava;
public bool PlainsShrineActive;
public bool DesertShrineActive;
public bool SnowShrineActive;
public bool VolcanoShrineActive;
public bool GlitchShrineActive;
string Plains;
string Desert;
string Snow;
string Volcano;
string Glitch;
public GameObject DeathSFX, KeySFX, DamageTakeSFX, ImpulseSFX, InvincSFX, DoorBreakSFX, FlySFX, DashSFX, AugmentSFX, MatrixSFX;
[SerializeField] Transform cam;
void Start()
{
rb = GetComponent();
rb.mass = NormalSpeed;
SetHealthText();
ForceField.SetActive(false);
MaxHealth = 50;
MaxHealth = 50;
}
void Update()
{
float HorizontalInput = Input.GetAxisRaw("Horizontal") * moveSpeed;
float VericalInput = Input.GetAxisRaw("Vertical") * moveSpeed;
Vector3 camFoward = cam.forward;
Vector3 camRight = cam.right;
camFoward.y = 0;
camRight.y = 0;
Vector3 FowardRelative = VericalInput * camFoward;
Vector3 RightRelative = HorizontalInput * camRight;
Vector3 moveDir = FowardRelative + RightRelative;
moveDirection = new Vector3(moveDir.x / 5, 0, moveDir.z / 5);
if(PlayerHealth <= 0 )
{
rb.isKinematic = true;
transform.position = new Vector3(2834f,3f,1121f);
rb.isKinematic = false;
PlayerHealth = MaxHealth;
DeathSFX.GetComponent().Play();
SetHealthText();
}
if(ShowDamage)
{
if(ShowDamageCount != 10)
{
ShowDamageCount++;
}
else
{
ShowDamage = false;
ShowDamageCount = 0;
MoreHealth.SetActive(false);
DamageTaken.SetActive(false);
}
}
if(TeleportObtained)
{
if(TeleportActive == false)
{
if(Input.GetKeyDown("4"))
{
TeleportActive = true;
TeleportText.gameObject.SetActive(true);
}
}
else
{
if(PlainsShrineActive)
{
Plains = "Plains";
}
else
{
Plains = "?";
}
if(DesertShrineActive)
{
Desert = "Desert";
}
else
{
Desert = "?";
}
if(SnowShrineActive)
{
Snow = "Snowy Mountains";
}
else
{
Snow = "?";
}
if(VolcanoShrineActive)
{
Volcano = "Volcanic Peaks";
}
else
{
Volcano = "?";
}
if(GlitchShrineActive)
{
Glitch = "Glitched Dimension";
}
else
{
Glitch = "?";
}
TeleportText.text = "Click number to teleport\nCANCEL: 4\n" + Plains + ": 5\n" + Desert + ": 6\n" + Snow + ": 7\n" + Volcano + ": 8\n" + Glitch + ": 9";
if(Input.GetKeyDown("4"))
{
TeleportText.gameObject.SetActive(false);
TeleportActive = false;
}
if(Input.GetKeyDown("5"))
{
if(PlainsShrineActive)
{
TeleportText.gameObject.SetActive(false);
TeleportActive = false;
rb.isKinematic = true;
transform.position = new Vector3(2456f,21f,1539f);
rb.isKinematic = false;
FlySFX.GetComponent().Play();
}
}
if(Input.GetKeyDown("6"))
{
if(DesertShrineActive)
{
TeleportText.gameObject.SetActive(false);
TeleportActive = false;
rb.isKinematic = true;
transform.position = new Vector3(2258f,21f,2356f);
rb.isKinematic = false;
FlySFX.GetComponent().Play();
}
}
if(Input.GetKeyDown("7"))
{
if(SnowShrineActive)
{
TeleportText.gameObject.SetActive(false);
TeleportActive = false;
rb.isKinematic = true;
transform.position = new Vector3(2707f,21f,157f);
rb.isKinematic = false;
FlySFX.GetComponent().Play();
}
}
if(Input.GetKeyDown("8"))
{
if(VolcanoShrineActive)
{
TeleportText.gameObject.SetActive(false);
TeleportActive = false;
rb.isKinematic = true;
transform.position = new Vector3(1535f,21f,670f);
rb.isKinematic = false;
FlySFX.GetComponent().Play();
}
}
if(Input.GetKeyDown("9"))
{
if(GlitchShrineActive)
{
TeleportText.gameObject.SetActive(false);
TeleportActive = false;
rb.isKinematic = true;
transform.position = new Vector3(2479f,21f,4375f);
rb.isKinematic = false;
FlySFX.GetComponent().Play();
}
}
}
}
if(InvincibilityObtained)
{
if(Input.GetKeyDown("3"))
{
if(InvincCooldownBool == false)
{
InvincSFX.GetComponent().Play();
ForceField.SetActive(true);
InvincActive = true;
InvincCooldownBool = true;
InvincCD.GetComponent().enabled = true;
}
else
{
ShowCooldown = true;
}
}
if (InvincCooldownBool)
{
InvincCooldown();
}
}
if(ImpulseObtained)
{
if(Input.GetKeyDown("2"))
{
if(ImpusleCooldownBool == false)
{
ImpulseSFX.GetComponent().Play();
ImpulseActive = true;
ImpusleCooldownBool = true;
ImpulseCD.GetComponent().enabled = true;
}
else
{
ShowCooldown = true;
}
}
if (ImpusleCooldownBool)
{
ImpulseCooldown();
}
}
if(DashObtained)
{
if(Input.GetKeyDown("1"))
{
if(SpeedCooldwonBool == false)
{
DashSFX.GetComponent().Play();
GetComponent().enabled = true;
SpeedActive = true;
SpeedCooldwonBool = true;
DashCD.GetComponent().enabled = true;
}
else
{
ShowCooldown = true;
}
}
if (SpeedCooldwonBool)
{
SpeedCooldown();
}
}
if (ShowCooldown)
{
COOLDOWN.GetComponent().enabled = true;
if (ShowCooldownCount != 60)
{
ShowCooldownCount = ShowCooldownCount + 1;
}
else
{
ShowCooldownCount = 0;
ShowCooldown = false;
COOLDOWN.GetComponent().enabled = false;
}
}
if(CostCheck)
{
if(CostCheckCount != 60)
{
CostCheckCount = CostCheckCount + 1;
}
else
{
CostNeeded.GetComponent().enabled = false;
CostCheckCount = 0;
CostCheck = false;
}
}
}
private void InvincCooldown()
{
if(InvincCoolCount != InvincCountDown)
{
InvincCoolCount = InvincCoolCount + 1;
InvincibilityCooldownText.text = ((InvincCountDown/60)-(InvincCoolCount/60)).ToString();
}
else
{
InvincCooldownBool = false;
InvincCoolCount = 0;
InvincCD.GetComponent().enabled = false;
InvincibilityCooldownText.text = "";
}
if(InvincCoolCount == duration)
{
InvincActive = false;
ForceField.SetActive(false);
}
}
private void SpeedCooldown()
{
if(SpeedActive)
{
rb.mass = AbilitySpeed;
}
if(SpeedCoolCount != SpeedCountdown)
{
SpeedCoolCount = SpeedCoolCount + 1;
DashCooldownText.text = ((SpeedCountdown/60)-(SpeedCoolCount/60)).ToString();
if(SpeedCoolCount == 60*5)
{
rb.mass = NormalSpeed;
GetComponent().enabled = false;
SpeedActive = false;
}
}
else
{
SpeedCoolCount = 0;
SpeedCooldwonBool = false;
DashCD.GetComponent().enabled = false;
DashCooldownText.text = "";
}
}
private void ImpulseCooldown()
{
if(ImpulseActive)
{
if(ImpulseShown)
{
if(ImpusleCoolCount==60)
{
Destroy(DestroyImpulse.gameObject);
ImpulseShown = false;
ImpulseActive = false;
}
if(ForceFieldShowCount == ForceFieldCount)
{
DestroyImpulse = Instantiate(Impulse,transform.position,Quaternion.Euler(new Vector3(0,0,0)));
ForceFieldShowCount = 0;
}
else
{
ForceFieldShowCount++;
}
}
else
{
Instantiate(ImpulseEffect,transform.position,Quaternion.Euler(new Vector3(0,0,-90)));
ImpulseShown = true;
}
}
if(ImpusleCoolCount != ImpulseCountDown)
{
ImpusleCoolCount = ImpusleCoolCount + 1;
ImpulseCooldownText.text = ((ImpulseCountDown/60)-(ImpusleCoolCount/60)).ToString();
}
else
{
ImpusleCoolCount = 0;
ImpusleCooldownBool = false;
ImpulseCD.GetComponent().enabled = false;
ImpulseCooldownText.text = "";
}
}
void FixedUpdate()
{
rb.AddForce(moveDirection * moveSpeed);
rb.AddForce(grav * rb.mass);
}
private void OnTriggerEnter(Collider other){
if(other.gameObject.CompareTag("DesertShrine"))
{
DesertShrineActive = true;
other.gameObject.SetActive(false);
}
if(other.gameObject.CompareTag("PlainsShrine"))
{
PlainsShrineActive = true;
other.gameObject.SetActive(false);
}
if(other.gameObject.CompareTag("SnowShrine"))
{
SnowShrineActive = true;
other.gameObject.SetActive(false);
}
if(other.gameObject.CompareTag("VolcanoShrine"))
{
VolcanoShrineActive = true;
other.gameObject.SetActive(false);
}
if(other.gameObject.CompareTag("GlitchShrine"))
{
GlitchShrineActive = true;
other.gameObject.SetActive(false);
}
if(other.gameObject.CompareTag("Collectible"))
{
Instantiate(explosionPrefab, other.transform.position, other.transform.rotation);
Destroy(other.gameObject);
scoreValue = scoreValue + 1;
KeySFX.GetComponent().Play();
}
if(other.gameObject.CompareTag("Matrix"))
{
if(other.GetComponent().enabled)
{
Instantiate(MatrixParticle, other.transform.position, other.transform.rotation);
if (PlayerHealth + 20 > MaxHealth)
{
Difference = MaxHealth - PlayerHealth;
PlayerArmour = PlayerArmour + Difference;
PlayerHealth = MaxHealth;
if (Difference == 0)
{
PlayerArmour = PlayerArmour + 20;
}
}
else
{
PlayerHealth = PlayerHealth + 20;
}
if (PlayerArmour > MaxArmour)
{
PlayerArmour = MaxArmour;
}
other.GetComponent().PlayerInteracted = true;
ShowHealthGain();
SetHealthText();
MatrixSFX.GetComponent().Play();
}
}
if(other.CompareTag("Augment"))
{
MaxArmour++;
MaxHealth++;
Damage++;
Instantiate(AugmentParticle,transform.position,Quaternion.Euler(new Vector3(-90,0,0)));
Destroy(other.gameObject);
SetHealthText();
AugmentSFX.GetComponent().Play();
}
if(other.CompareTag("Lava"))
{
inLava = true;
InvokeRepeating("LavaDamage",0.5f,0.5f);
}
if(other.CompareTag("VirusImpulse"))
{
if(PlayerArmour >= 10)
{
PlayerArmour = PlayerArmour - 10;
}
else
{
var Difference = 10 - PlayerArmour;
PlayerHealth = PlayerHealth - Difference;
PlayerArmour = 0;
}
ShowTakenDamge();
SetHealthText();
}
if(other.CompareTag("Check"))
{
if(DashObtained && TeleportObtained && ImpulseObtained && InvincibilityObtained)
{
other.gameObject.SetActive(false);
Portal.SetActive(true);
}
else
{
PortalText.GetComponent().enabled = true;
}
}
if(other.CompareTag("Portal"))
{
rb.isKinematic = true;
transform.position = new Vector3(2755f,27f,4283f);
rb.isKinematic = false;
}
if(other.CompareTag("PlainsPortal"))
{
rb.isKinematic = true;
transform.position = new Vector3(2088f,17f,1826f);
rb.isKinematic = false;
}
SetSCoreText();
}
void OnTriggerExit(Collider other)
{
if(other.CompareTag("Lava"))
{
inLava = false;
}
if(other.CompareTag("Check"))
{
PortalText.GetComponent().enabled = false;
}
}
void SetSCoreText()
{
scoreText.text = scoreValue.ToString();
}
public void SetHealthText()
{
HealthText.text = PlayerHealth.ToString();
ArmourText.text = PlayerArmour.ToString();
}
private void OnCollisionEnter(Collision other)
{
if(other.gameObject.CompareTag("Cactus"))
{
if(PlayerArmour >= 5)
{
PlayerArmour = PlayerArmour - 5;
}
else
{
var Difference = 5 - PlayerArmour;
PlayerHealth = PlayerHealth - Difference;
PlayerArmour = 0;
}
ShowTakenDamge();
SetHealthText();
}
if(other.gameObject.CompareTag("Door"))
{
check = other.gameObject.GetComponent().cost;
if(scoreValue >= check)
{
scoreValue = scoreValue - check;
Destroy(other.gameObject);
Instantiate(explosionPrefab, other.transform.position,transform.rotation);
SetSCoreText();
DoorBreakSFX.GetComponent().Play();
}
else
{
int Difference = check - scoreValue;
CostNeeded.text = "Gather " + Difference.ToString() + " more Energy";
CostCheck = true;
CostNeeded.GetComponent().enabled = true;
}
}
}
void LavaDamage()
{
if(inLava)
{
PlayerHealth = PlayerHealth - 1;
ShowTakenDamge();
SetHealthText();
}
}
public void ShowTakenDamge()
{
DamageTaken.SetActive(true);
ShowDamage = true;
DamageTakeSFX.GetComponent().Play();
}
public void ShowHealthGain()
{
MoreHealth.SetActive(true);
ShowDamage = true;
}
}
public class EnemyProx : MonoBehaviour
{
public GameObject EnemyGameObject;
public GameObject Target;
bool PlayerinProx;
public float Distance;
public int EnemySpeed;
public float speed=10f;
private int RotateCount;
void Start()
{
}
void Update()
{
if(PlayerinProx)
{
if(EnemyGameObject.gameObject.GetComponent().CooldownActive == false)
{
Vector3 targetDirection = Target.transform.position - transform.position;
float singleStep = speed * Time.deltaTime;
Vector3 newDirection = Vector3.RotateTowards(transform.forward, - targetDirection, singleStep, 0.0f);
transform.rotation = Quaternion.LookRotation(newDirection, Vector3.up);
transform.position = Vector3.MoveTowards(transform.position, Target.transform.position, EnemySpeed * Time.deltaTime);
}
}
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Player"))
{
PlayerinProx = true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject.CompareTag("Player"))
{
PlayerinProx = false;
}
}
}
public class EnemyScript : MonoBehaviour
{
public int Health;
public int Damage;
public GameObject Parent;
public RollyBall script;
public Text HealthText;
public Text ArmourText;
public GameObject InvincCD;
public bool CooldownActive;
public int DamageCooldown;
public int CooldownCount;
private int CurrentHealth;
private int CurrentArmour;
private int Difference;
void Start()
{
}
void Update()
{
if(CooldownActive)
{
if (CooldownCount != DamageCooldown)
{
CooldownCount = CooldownCount + 1;
if(CooldownCount == DamageCooldown)
{
CooldownActive = false;
CooldownCount = 0;
}
}
}
}
private void OnCollisionEnter(Collision other)
{
if(other.gameObject.CompareTag("Player"))
{
if(script.InvincActive == false)
{
if (CooldownActive == false)
{
CurrentArmour = other.gameObject.GetComponent().PlayerArmour;
CurrentHealth = other.gameObject.GetComponent().PlayerHealth;
if(CurrentArmour >= Damage)
{
CurrentArmour = CurrentArmour - Damage;
}
else
{
Difference = Damage - CurrentArmour;
CurrentHealth = CurrentHealth - Difference;
CurrentArmour = 0;
}
other.gameObject.GetComponent().PlayerArmour = CurrentArmour;
other.gameObject.GetComponent().PlayerHealth = CurrentHealth;
CooldownActive = true;
other.gameObject.GetComponent().ShowTakenDamge();
SetHealthText();
}
}
}
}
public void SetHealthText()
{
HealthText.text = CurrentHealth.ToString();
ArmourText.text = CurrentArmour.ToString();
}
}
This texture resembles the wood/bark that you can find on the tree assets around the first biome of the game. I chose this texture as it was simple and basic and on the other hand has a decent amount of detail. This texture was found on Filter Forge and created by Aurum.
This image shows my chosen texture that will be used for Grass. Will mostly be used in the plains biome to represent the lush and vibrant atmosphere that the beginning of the game will provide with the player to grasp their interest. I wanted all my textures to have a somewhat "illustrative" style to it to set a cartoonish world for the game. This texture was found on ArtStation and created by Mononoke.
This is a texture of leaves for the tree asset that can be found in the Plains Biome. I chose this texture as it fits the illustrative theme of the Plains Biome and thought that would contrast well in detail along with the wood texture above. This texture was found on pinetrest and created by Vector Stocks.
This is the texture that I found on Open Art that will resemble the cliffs/walls of the plains biome. I chose this texture as it gave me the impression of looking like ruins as well as a cliff. With the 2 concepts blended together, i thought that it would make a really good texture for the wall, creating an immersive atmosphere for the plains. I found this texture on Open Art, Open Art is a website that generates a texture from a prompt using AI, I do not claim this texture therefore it will be credited to Open Art AI.
This is a texture that will resemble the rocks appearance that can be found in the plains biome. I went for the texture as I thought it would contrast well with the grassy texture found above. Similarly to the wood texture, this texture was found on Filter Forge however was created by emme.
I found this texture on Shutter stock and used it while texturing the appearance of the enemy. I went for a scale like texture for the enemies because I wanted them to feel familiar to the player, visually showing that enemies are hostile. My initial idea for enemy appearance was making them look like goblins, however I differed from my idea by making them look lizard like however I inherited the goblin idea through colour and thats why I chose this colour specifically. It matches the colour of goblins and gives of a hostile nature to the ability. This texture was made by Mr.Alex M and uploaded by him on Shutter stock, therefore I give him the credit for using this texture.
This texture was also found on open Art and created by openArt AI. It consists of an illustrative texture of sand that will be used for the surface of the desert biome.
(Link not found)
This texture was found on the internet and on dreams time. It consists of a liquid metal texture that will be used for Augments (the Collectible that the player can collect that increments their stats). I went for this kind of texture as It gave me the impression of looking precious and stable which correlates to the Augment collectible that the player can find through out the world. This texture was uploaded and created by Alexandra Nedviga on Dreamstime.com.
This is the texture that resembles a canyon like cliff texture that I intend to place as the walls for the desert biome. I thought that this texture would blend really well with the sand texture found above to create a desert like visual and atmosphere for the player to explore in. This texture was also found on Filter Forge and also created by jitspoe.
Moving on to the Volcanic Peaks biome, I used this texture to highlight the lava areas that make the player take damage if in the vicinity. I chose this texture as it visually highlights lava and looks like lava. This texture was uploaded by puruswatam and uploaded on CLEANPNG.
This is the texture that I used for the peaks of the walls as well as the Snowy Mountains Temple. It is a snow texture that helped me create an immersive atmosphere for the player when they enter the biome. Making them feel cold. This texture was uploaded by Many Texturs. Texturedb is a website that provides free textures.
This is the texture that will be used for the wall as for the Volcanic Peaks biome as well as the chamber. I chose this texture as it gives me the impression of violence and danger, using this texture I wanted to set an atmosphere to indicate that the player is in a dangerous and place and indicated to be cautious. This texture was created by cowboyleland and uploaded on flickr
This texture consists of a purple gem like image. This texture will be used for indicating that the player is healing as well as the portal that can be found in the plains biome. I selected this texture as it resembles Royalty and Preciousness/Value, i wanted to use this on the portal to indicate that the player is entering a highly royal area however in a corrupted manner which will be resembled by the static textures which are shown below. To resemble the Glitched Dimension (the final biome of the game) as well as the Entity, I wanted to use Black and Purple colours to resemble Royalty and evil. This texture was made using OpenArt AI and found on Open Art.
This texture shows a black Sci-Fi plate and my intension of using this was to create a some what futuristic vibe to when the player comes across Glitched Architecture. Glitched Architecture will have Purple and Black Colours, resembling their status in power and royalty as well as their dark and evil ambitions. This texture will be used on structures such as the Shrines and The portals found on the plains. This Texture was uploaded on Pinterest created by lleandro .
This is the Final Texture that I have used for my game, consisting of a static Purple. This texture will be used all over the Glitched Dimension, further implying that the player is in an area full of royalty and corruption. The texture above was uploaded on Deviant Art and created by TheFrozenWaffle.