Quantcast
Channel: Questions in topic: "enemy"
Viewing all articles
Browse latest Browse all 1488

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

$
0
0
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(); player = GameObject.FindGameObjectWithTag("Player").GetComponent(); sprite = GetComponentInChildren(); } 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(); player = GameObject.FindGameObjectWithTag("Player").GetComponent(); sprite = GetComponentInChildren(); } 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; } }

Viewing all articles
Browse latest Browse all 1488

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>