Commit f79517f5 authored by Max's avatar Max
Browse files

Added melee attack to shroombie and some comments to scripts

parent 32d2037e
......@@ -63,51 +63,51 @@ AnimatorStateMachine:
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 1986224911852984551}
m_Position: {x: 160, y: -700, z: 0}
m_Position: {x: 0, y: 610, z: 0}
- serializedVersion: 1
m_State: {fileID: -5726667960790394763}
m_Position: {x: 570, y: -700, z: 0}
m_Position: {x: 410, y: 610, z: 0}
- serializedVersion: 1
m_State: {fileID: 1613508073392012693}
m_Position: {x: 370, y: -590, z: 0}
m_Position: {x: 210, y: 720, z: 0}
- serializedVersion: 1
m_State: {fileID: -146394166480829469}
m_Position: {x: 160, y: -480, z: 0}
m_Position: {x: 0, y: 830, z: 0}
- serializedVersion: 1
m_State: {fileID: 1908170977453030910}
m_Position: {x: 570, y: -480, z: 0}
m_Position: {x: 410, y: 830, z: 0}
- serializedVersion: 1
m_State: {fileID: -8829084069974649071}
m_Position: {x: 160, y: -370, z: 0}
m_Position: {x: 0, y: 940, z: 0}
- serializedVersion: 1
m_State: {fileID: 7901652581942858491}
m_Position: {x: -60, y: -390, z: 0}
m_Position: {x: -220, y: 920, z: 0}
- serializedVersion: 1
m_State: {fileID: -6900157825039734015}
m_Position: {x: 570, y: -370, z: 0}
m_Position: {x: 410, y: 940, z: 0}
- serializedVersion: 1
m_State: {fileID: -7097187114788860558}
m_Position: {x: 790, y: -390, z: 0}
m_Position: {x: 630, y: 920, z: 0}
- serializedVersion: 1
m_State: {fileID: 5457543667087210628}
m_Position: {x: -30, y: -570, z: 0}
m_Position: {x: -190, y: 740, z: 0}
- serializedVersion: 1
m_State: {fileID: -2279491765987039389}
m_Position: {x: -120, y: -480, z: 0}
m_Position: {x: -280, y: 830, z: 0}
- serializedVersion: 1
m_State: {fileID: 4045761067660368507}
m_Position: {x: 850, y: -480, z: 0}
m_Position: {x: 690, y: 830, z: 0}
- serializedVersion: 1
m_State: {fileID: 686666860851240575}
m_Position: {x: 770, y: -580, z: 0}
m_Position: {x: 610, y: 730, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 970, y: -90, z: 0}
m_EntryPosition: {x: 590, y: -810, z: 0}
m_ExitPosition: {x: 970, y: -10, z: 0}
m_AnyStatePosition: {x: 760, y: 1080, z: 0}
m_EntryPosition: {x: 430, y: 500, z: 0}
m_ExitPosition: {x: 760, y: 1160, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -5726667960790394763}
--- !u!114 &-7454672916790918509
......@@ -307,7 +307,15 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ba893100c96824248a33342bc047efb6, type: 3}
m_Name:
m_EditorClassIdentifier:
facingRight: 0
meleeTiming: 0
verticalOffset: 0.5
horizontalOffset: 0.5
attackRangeX: 1
attackRangeY: 1
whatIsPlayer:
serializedVersion: 2
m_Bits: 1024
--- !u!1101 &-5990042557740589001
AnimatorStateTransition:
m_ObjectHideFlags: 1
......@@ -960,37 +968,37 @@ AnimatorController:
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: MovingRight
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: Melee
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: Ranged
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: RunBack
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: RunTowards
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
......@@ -1565,7 +1573,15 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ba893100c96824248a33342bc047efb6, type: 3}
m_Name:
m_EditorClassIdentifier:
facingRight: 1
meleeTiming: 0
verticalOffset: 0.5
horizontalOffset: 0.5
attackRangeX: 1
attackRangeY: 1
whatIsPlayer:
serializedVersion: 2
m_Bits: 1024
--- !u!1101 &8600512932900247119
AnimatorStateTransition:
m_ObjectHideFlags: 1
......
......@@ -45,51 +45,67 @@ public class CrawlerWalkBehaviour : StateMachineBehaviour
{
if (Vector3.Distance(myTransform.position, player.transform.position) < alertDistance && isIdle)
{
animator.SetBool("Alerted", true);
animator.SetBool("Alerted", true); //wechselt in die Alerted Animation
}
else if (Vector3.Distance(myTransform.position, player.transform.position) > backToIdleDistance && !isIdle)
{
animator.SetBool("Alerted", false);
animator.SetBool("Alerted", false); //wechselt zurück in die Idle Animation
}
if (isWalkingRight)
{
Vector2 lineCastPosition = myTransform.position + myTransform.right * myWidth;
Vector2 right = new Vector2(myTransform.right.x, myTransform.right.y);
//wenn isOnGround Boden trifft, dann kann sich der Gegner noch bewegen
bool isOnGround = Physics2D.Linecast(lineCastPosition, lineCastPosition + Vector2.down, whatIsGround);
Debug.DrawLine(lineCastPosition, lineCastPosition + Vector2.down);
Vector2 right = new Vector2(myTransform.right.x, myTransform.right.y);
//wenn isBlocked nichts trifft, dann kann sich der Gegner noch bewegen
bool isBlocked = Physics2D.Linecast(lineCastPosition, lineCastPosition + right * 0.1f, whatIsGround);
//Visualisierung der linecasts mit Linien im Szene-Modus
Debug.DrawLine(lineCastPosition, lineCastPosition + Vector2.down);
Debug.DrawLine(lineCastPosition, lineCastPosition + right * 0.1f);
//schaut, ob Gegner sich noch bewegen kann
//wenn nein
if (!isOnGround || isBlocked)
{
animator.SetBool("MovingRight", false);
animator.SetBool("MovingRight", false); //wechselt die Bewegungsrichtung
}
//wenn ja
else
{
myTransform.position = Vector3.MoveTowards(myTransform.position, myTransform.position + Vector3.right, speed * Time.deltaTime);
myTransform.position = Vector3.MoveTowards(myTransform.position, myTransform.position + Vector3.right, speed * Time.deltaTime); //bewegt den Gegner nach rechts
}
}
else
{
//Visualisierung der casts mit Linien im Szene-Modus
Vector2 lineCastPosition = myTransform.position - myTransform.right * myWidth;
Vector2 right = new Vector2(myTransform.right.x, myTransform.right.y);
//wenn isOnGround Boden trifft, dann kann sich der Gegner noch bewegen
bool isOnGround = Physics2D.Linecast(lineCastPosition, lineCastPosition + Vector2.down, whatIsGround);
Debug.DrawLine(lineCastPosition, lineCastPosition + Vector2.down);
Vector2 right = new Vector2(myTransform.right.x, myTransform.right.y);
//wenn isBlocked nichts trifft, dann kann sich der Gegner noch bewegen
bool isBlocked = Physics2D.Linecast(lineCastPosition, lineCastPosition - right * 0.1f, whatIsGround);
//Visualisierung der linecasts mit Linien im Szene-Modus
Debug.DrawLine(lineCastPosition, lineCastPosition + Vector2.down);
Debug.DrawLine(lineCastPosition, lineCastPosition - right * 0.1f);
//schaut, ob Gegner sich noch bewegen kann
//wenn nein
if (!isOnGround || isBlocked)
{
animator.SetBool("MovingRight", true);
animator.SetBool("MovingRight", true); //wechselt die Bewegungsrichtung
}
//wenn ja
else
{
myTransform.position = Vector3.MoveTowards(myTransform.position, myTransform.position - Vector3.right, speed * Time.deltaTime);
myTransform.position = Vector3.MoveTowards(myTransform.position, myTransform.position - Vector3.right, speed * Time.deltaTime); //bewegt den Gegner nach links
}
}
}
......
......@@ -14,13 +14,7 @@ public class PlantAI : MonoBehaviour
//gibt die Zeit zwischen Spawns und die Geschwindigkeit der Sporen an
public float timeBetweenSporeSpawns;
private float timer;
// Start is called before the first frame update
void Start()
{
}
private float timer;
// Update is called once per frame
void Update()
......@@ -29,6 +23,7 @@ public class PlantAI : MonoBehaviour
{
GameObject g;
//rotiert die Sporen passend, sodass "oben" für die Sporen die jeweilige angegebene Richtung ist
if (shootingDirection == ShootDir.LEFT)
{
g = Instantiate(sporePrefab, transform.position + Vector3.left * 1.5f, Quaternion.Euler(transform.rotation.x, transform.rotation.y, 90f));
......
......@@ -4,26 +4,107 @@ using UnityEngine;
public class ShroombieMeleeBehaviour : StateMachineBehaviour
{
//Referenz auf Position
private Transform myTransform;
//Referenz auf den Spieler
private GameObject player;
//bool zum Anzeigen der Richtung
public bool facingRight;
//verschiebt das Erscheinen der Hitbox um diese Anzahl von Sekunden (zum Anpassen an Animation)
public float meleeTiming;
//wie lange die Hitbox noch da bleibt
public float hitBoxLingering;
private float timer;
private float hBTimer;
//bool um zu schauen ob geschossen wurde
private bool done;
//Offset des Colliders zum Sprite
public float verticalOffset;
public float horizontalOffset;
//Radius des Angriffs
public float attackRangeX;
public float attackRangeY;
//Layer, auf der der Spieler ist
public LayerMask whatIsPlayer;
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
player = GameObject.FindGameObjectWithTag("Player");
player = GameObject.FindGameObjectWithTag("Player");
timer = meleeTiming;
hBTimer = hitBoxLingering;
done = false;
myTransform = animator.transform;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.SetBool("Melee", false);
if(timer < 0f && !done)
{
//Position und Größe des BoxColliders
Vector3 attackPos;
Vector3 size = new Vector3(attackRangeX, attackRangeY, 0f);
//ändert die Angriffsposition je nach Blickrichtung
if (facingRight)
{
attackPos = myTransform.position + horizontalOffset * Vector3.right + verticalOffset * Vector3.up;
}
else
{
attackPos = myTransform.position - horizontalOffset * Vector3.right + verticalOffset * Vector3.up;
}
//lässt einen BoxCollider erscheinen und setzt alle Kollisionen in das Array
Collider2D[] playerToDamage = Physics2D.OverlapBoxAll(attackPos, size, whatIsPlayer);
//Visualisierung der Hitbox für den Szenemodus
Vector3 topRight = new Vector3(attackPos.x + (attackRangeX / 2), attackPos.y + (attackRangeY / 2), attackPos.z);
Vector3 topLeft = new Vector3(attackPos.x - (attackRangeX / 2), attackPos.y + (attackRangeY / 2), attackPos.z);
Vector3 bottomLeft = new Vector3(attackPos.x - (attackRangeX / 2), attackPos.y - (attackRangeY / 2), attackPos.z);
Vector3 bottomRight = new Vector3(attackPos.x + (attackRangeX / 2), attackPos.y - (attackRangeY / 2), attackPos.z);
Debug.DrawLine(topRight, topLeft);
Debug.DrawLine(topLeft, bottomLeft);
Debug.DrawLine(bottomLeft, bottomRight);
Debug.DrawLine(bottomRight, topRight);
for (int i = 0; i < playerToDamage.Length; i++)
{
//TODO: Spieler Schaden hinzufügen
}
//done auf true setzen, wenn die Hitbox nicht mehr erscheinen soll
if (hBTimer < 0)
{
hBTimer = hitBoxLingering;
timer = meleeTiming;
done = true;
}
else
{
hBTimer -= Time.deltaTime;
}
}
else
{
timer -= Time.deltaTime;
}
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
}
//override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
}
......@@ -23,7 +23,7 @@ public class ShroombieRangedBehaviour : StateMachineBehaviour
//Geschwindigkeit des Projektils
public float speed;
//bool um zu schauen ob geschossen wurde
//bool um zu schauen ob während der Animation schon geschossen wurde
private bool done;
//Offset des shootingPoint zum Sprite
......@@ -50,6 +50,7 @@ public class ShroombieRangedBehaviour : StateMachineBehaviour
{
Vector3 shootingPoint;
//ändert den Schusspunkt je nach Blickrichtung
if (facingRight)
{
shootingPoint = myTransform.position + horizontalOffset * Vector3.right + verticalOffset * Vector3.up;
......@@ -59,9 +60,11 @@ public class ShroombieRangedBehaviour : StateMachineBehaviour
shootingPoint = myTransform.position - horizontalOffset * Vector3.right + verticalOffset * Vector3.up;
}
//berechnet die Richtung und den benötigten Winkel für das Projektil
Vector3 dir = player.transform.position - shootingPoint;
float rotZ = Mathf.Atan2(-dir.normalized.x, dir.normalized.y) * Mathf.Rad2Deg;
//lässt das Projekil mit der richtigen Rotation erscheinen
Instantiate(projectile, shootingPoint, Quaternion.Euler(0f, 0f, rotZ));
timer = shootTiming;
......
......@@ -52,6 +52,7 @@ public class ShroombieWalkBehaviour : StateMachineBehaviour
myWidth = sprite.bounds.extents.x;
myHeight = sprite.bounds.extents.y;
//eine zufällige Zahl berechnen, wenn der Gegner aufmerksam auf den Spieler ist
if(!idle)
{
random = Random.Range(0, 100);
......@@ -61,61 +62,62 @@ public class ShroombieWalkBehaviour : StateMachineBehaviour
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.SetBool("RunTowards", false);
//bools auf false setzen, damit der Übergang zurück geschieht
animator.SetBool("RunTowards", false);
animator.SetBool("RunBack", false);
//Gegner auf alarmiert setzen, wenn Spieler in Reichweite
if (Vector3.Distance(myTransform.position, player.transform.position) < alertDistance && idle)
{
animator.SetBool("Alerted", true);
}
//Gegner auf nicht alarmiert setzen, wenn Spieler wieder außer Reichweite
else if (Vector3.Distance(myTransform.position, player.transform.position) > backToIdleDistance && !idle)
{
animator.SetBool("Alerted", false);
}
if (idle || walkingTowards)
{
Walk(animator);
}
else if(walkingBack)
//Gegner soll laufen, wenn er in einem der "Laufmodi" ist
if (idle || walkingTowards || walkingBack)
{
Walk(animator);
}
else
{
isFacingPlayer = CheckIfFacingPlayer(myTransform);
if(isFacingPlayer)
isFacingPlayer = CheckIfFacingPlayer(myTransform); //überprüfen, ob der Gegner auf den Spieler schaut
//wenn ja, dann einen Angriff aussuchen
if (isFacingPlayer)
{
//Fernkampfangriff
if(0 <= random && random <= meleeProbability)
if (0 <= random && random <= meleeProbability)
{
animator.SetBool("Ranged", true);
}
//Nahkampfangriff, wenn in Reichweite
else if(meleeProbability <= random && random <= meleeProbability + rangedProbability && Vector3.Distance(myTransform.position, player.transform.position) < meleeRange)
else if (meleeProbability <= random && random <= meleeProbability + rangedProbability && Vector3.Distance(myTransform.position, player.transform.position) < meleeRange)
{
animator.SetBool("Melee", true);
}
//auf Spieler zu gehen, wenn nicht in Reichweite
//auf Spieler zu gehen, wenn nicht in Nachkampfreichweite
else if (meleeProbability <= random && random <= meleeProbability + rangedProbability && Vector3.Distance(myTransform.position, player.transform.position) >= meleeRange)
{
Walk(animator);
}
//normal auf den Spieler zu bewegen
else if(meleeProbability + rangedProbability <= random && random <= meleeProbability + rangedProbability + (walkProbability / 2))
else if (meleeProbability + rangedProbability <= random && random <= meleeProbability + rangedProbability + (walkProbability / 2))
{
animator.SetBool("RunTowards", true);
animator.SetBool("RunTowards", true); //Animationwechsel
}
//rückwärts bewegen
else
{
animator.SetBool("RunBack", true);
animator.SetBool("RunBack", true); //Animationwechsel
}
}
//wenn nein, dann in die entgegengesetzte Richtung drehen
else
{
if(walkingRight)
if (walkingRight)
{
animator.SetBool("MovingRight", false);
}
......
......@@ -13,6 +13,7 @@ public class sporeMovement : MonoBehaviour
// Start is called before the first frame update
void Start()
{
//bewegt die Hitbox entgegen der Bewegungsrichtung, damit es visuell besser passt
Vector2 offset;
offset = Vector3.down * 0.75f;
col.offset = offset;
......@@ -21,11 +22,13 @@ public class sporeMovement : MonoBehaviour
// Update is called once per frame
void Update()
{
//bewegt Sporen "nach oben"
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
private void OnCollisionEnter2D(Collision2D other)
{
//bei einer Kollision einen Explosioneffekt abspielen und Partikel zerstören
Instantiate(explodeEffect, transform.position, Quaternion.identity);
Destroy(gameObject);
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment