platform ai following player direction when close, flips normal movement ,cant get my enemy to keep his sprite position when moving back to move after following during attack
so i have a enemy that moves left and right and when he gets in attack range he looks left or right depending where the player is. it works fine but then when he moves back into his normal patrol, his sprites are flipped, im not sure what to add where
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Grunt : MonoBehaviour {
public int health;
public int speed;
public int gems;
private Vector3 groundDetection;
public bool facingRight;
public Animator animator;
protected Player player;
protected SpriteRenderer sprite;
protected Transform playerr;
public void Awake() {
facingRight = true;
animator = this.transform.GetComponentInChildren<Animator>();
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
sprite = GetComponentInChildren<SpriteRenderer>();
}
public void Start() {
}
public void Update() {
float distance = Vector3.Distance(transform.localPosition, player.transform.localPosition);
Vector3 direction = player.transform.localPosition - transform.localPosition;
if (distance < 2f )
{
Attack();
}
else
StartCoroutine(Move());
}
public void Attack() {
float distance = Vector3.Distance(transform.localPosition, player.transform.localPosition);
Vector3 direction = player.transform.localPosition - transform.localPosition;
animator.SetBool("InCombat", true);
animator.SetBool("InRange", true);
animator.SetBool("Idle", false);
if (direction.x > 0 && animator.GetBool("InCombat") == true)
{
sprite.flipX = false;
}
else if (direction.x < 0 && animator.GetBool("InCombat") == true)
{
sprite.flipX = true;
}
if (distance > 2f)
{
animator.SetBool("InCombat", false);
animator.SetBool("InRange", false);
StartCoroutine(Move());
return;
}
}
public IEnumerator Move() {
animator.SetBool("InCombat", false);
animator.SetBool("InRange", false);
if (facingRight) {
groundDetection = Quaternion.AngleAxis(-45, transform.forward) * transform.right;
RaycastHit2D hit = Physics2D.Raycast(transform.position, groundDetection, 2.75f, 1 << 8);
RaycastHit2D hit1 = Physics2D.Raycast(transform.position, Vector3.right, 1.5f, 1 << 8);
Debug.DrawRay(transform.position, groundDetection * 2.75f, Color.green);
Debug.DrawRay(transform.position, Vector3.right * 1.5f, Color.green);
if (hit.collider != null) {
animator.SetTrigger("Move");
transform.Translate(Vector3.right * speed * Time.deltaTime);
} else if (hit1.collider != null) {
transform.Translate(Vector3.right * speed * Time.deltaTime);
} else {
animator.SetTrigger("Idle");
yield return new WaitForSeconds(3);
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")) {
if (facingRight) {
Flip();
}
animator.SetTrigger("Move");
}
}
} else {
groundDetection = Quaternion.AngleAxis(45, transform.forward) * -transform.right;
RaycastHit2D hit = Physics2D.Raycast(transform.position, groundDetection, 2.75f, 1 << 8);
RaycastHit2D hit1 = Physics2D.Raycast(transform.position, -Vector3.right, 1.5f, 1 << 8);
Debug.DrawRay(transform.position, groundDetection * 2.75f, Color.green);
Debug.DrawRay(transform.position, -Vector3.right * 1.5f, Color.green);
if (hit.collider != null) {
transform.Translate(Vector3.left * speed * Time.deltaTime);
} else if (hit1.collider != null) {
Debug.Log("Hit stuff.");
transform.Translate(Vector3.left * speed * Time.deltaTime);
} else {
animator.SetTrigger("Idle");
yield return new WaitForSeconds(3);
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")) {
if (!facingRight) {
Flip();
}
animator.SetTrigger("Move");
}
}
}
}
private void Flip() {
Debug.Log("Flipped");
facingRight = !facingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
} ,so i got my enemy moving left and right and when i get into attack range he follows left and right, but when he moves back to patrolling he gets backwards.
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Grunt : MonoBehaviour {
public int health;
public int speed;
public int gems;
private Vector3 groundDetection;
public bool facingRight;
public Animator animator;
protected Player player;
protected SpriteRenderer sprite;
protected Transform playerr;
public void Awake() {
facingRight = true;
animator = this.transform.GetComponentInChildren<Animator>();
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
sprite = GetComponentInChildren<SpriteRenderer>();
}
public void Start() {
}
public void Update() {
float distance = Vector3.Distance(transform.localPosition, player.transform.localPosition);
Vector3 direction = player.transform.localPosition - transform.localPosition;
if (distance < 2f )
{
Attack();
}
else
StartCoroutine(Move());
}
public void Attack() {
float distance = Vector3.Distance(transform.localPosition, player.transform.localPosition);
Vector3 direction = player.transform.localPosition - transform.localPosition;
animator.SetBool("InCombat", true);
animator.SetBool("InRange", true);
animator.SetBool("Idle", false);
if (direction.x > 0 && animator.GetBool("InCombat") == true)
{
sprite.flipX = false;
}
else if (direction.x < 0 && animator.GetBool("InCombat") == true)
{
sprite.flipX = true;
}
if (distance > 2f)
{
animator.SetBool("InCombat", false);
animator.SetBool("InRange", false);
StartCoroutine(Move());
return;
}
}
public IEnumerator Move() {
animator.SetBool("InCombat", false);
animator.SetBool("InRange", false);
if (facingRight) {
groundDetection = Quaternion.AngleAxis(-45, transform.forward) * transform.right;
RaycastHit2D hit = Physics2D.Raycast(transform.position, groundDetection, 2.75f, 1 << 8);
RaycastHit2D hit1 = Physics2D.Raycast(transform.position, Vector3.right, 1.5f, 1 << 8);
Debug.DrawRay(transform.position, groundDetection * 2.75f, Color.green);
Debug.DrawRay(transform.position, Vector3.right * 1.5f, Color.green);
if (hit.collider != null) {
animator.SetTrigger("Move");
transform.Translate(Vector3.right * speed * Time.deltaTime);
} else if (hit1.collider != null) {
transform.Translate(Vector3.right * speed * Time.deltaTime);
} else {
animator.SetTrigger("Idle");
yield return new WaitForSeconds(3);
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")) {
if (facingRight) {
Flip();
}
animator.SetTrigger("Move");
}
}
} else {
groundDetection = Quaternion.AngleAxis(45, transform.forward) * -transform.right;
RaycastHit2D hit = Physics2D.Raycast(transform.position, groundDetection, 2.75f, 1 << 8);
RaycastHit2D hit1 = Physics2D.Raycast(transform.position, -Vector3.right, 1.5f, 1 << 8);
Debug.DrawRay(transform.position, groundDetection * 2.75f, Color.green);
Debug.DrawRay(transform.position, -Vector3.right * 1.5f, Color.green);
if (hit.collider != null) {
transform.Translate(Vector3.left * speed * Time.deltaTime);
} else if (hit1.collider != null) {
Debug.Log("Hit stuff.");
transform.Translate(Vector3.left * speed * Time.deltaTime);
} else {
animator.SetTrigger("Idle");
yield return new WaitForSeconds(3);
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")) {
if (!facingRight) {
Flip();
}
animator.SetTrigger("Move");
}
}
}
}
private void Flip() {
Debug.Log("Flipped");
facingRight = !facingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
Your answer
Follow this Question
Related Questions
2D Enemy Ai 0 Answers
AI stops following player. 1 Answer
Trouble making jumping spider enemies 0 Answers
why does my enemy attack backwards? 0 Answers
Making smart enemy AI using GOAP 0 Answers