Question by
Troodamium · Jun 16, 2021 at 09:20 PM ·
2draycastscript.rigidbody2denemy ai
raycast2d problem enemies,Raycast2D problem
Hi, i am making a 2d rpg but the enemies doesnt go to the player , your can help me?. This is my code
// Variables para gestionar el radio de visión, el de ataque y la velocidad
public float visionRadius;
public float attackRadius;
public float speed;
public Vector2 dir;
// Variable para guardar al jugador
GameObject player;
// Variable para guardar la posición inicial
Vector3 initialPosition;
// Animador y cuerpo cinemático con la rotación en Z congelada
Animator anim;
Rigidbody2D rb2d;
void Start () {
// Recuperamos al jugador gracias al Tag
player = GameObject.FindGameObjectWithTag("player");
// Guardamos nuestra posición inicial
initialPosition = transform.position;
anim = GetComponent<Animator>();
rb2d = GetComponent<Rigidbody2D>();
}
void Update () {
// Por defecto nuestro target siempre será nuestra posición inicial
Vector3 target = initialPosition;
// Comprobamos un Raycast del enemigo hasta el jugador
RaycastHit2D hit = Physics2D.Raycast(
transform.position,
player.transform.position - transform.position,
visionRadius,
1 << LayerMask.NameToLayer("Default")
// Poner el propio Enemy en una layer distinta a Default para evitar el raycast
// También poner al objeto Attack y al Prefab Slash una Layer Attack
// Sino los detectará como entorno y se mueve atrás al hacer ataques
);
// Aquí podemos debugear el Raycast
Vector3 forward = transform.TransformDirection(player.transform.position - transform.position);
Debug.DrawRay(transform.position, forward, Color.red);
// Si el Raycast encuentra al jugador lo ponemos de target
if (hit.collider != null) {
if (hit.collider.tag == "player"){
target = player.transform.position;
}
}
// Calculamos la distancia y dirección actual hasta el target
float distance = Vector3.Distance(target, transform.position);
Vector3 dir = (target - transform.position).normalized;
// Si es el enemigo y está en rango de ataque nos paramos y le atacamos
if (target != initialPosition && distance < attackRadius){
// Aquí le atacaríamos, pero por ahora simplemente cambiamos la animación
anim.SetFloat("x", dir.x);
anim.SetFloat("y", dir.y);
anim.SetBool("Atacando", true);
// Congela la animación de andar
}
// En caso contrario nos movemos hacia él
else {
rb2d.MovePosition(transform.position + dir * speed * Time.deltaTime);
// Al movernos establecemos la animación de movimiento
anim.speed = 2;
anim.SetFloat("x", dir.x);
anim.SetFloat("y", dir.y);
anim.SetLayerWeight(1, 1);
}
// Una última comprobación para evitar bugs forzando la posición inicial
if (target == initialPosition && distance < 0.02f){
transform.position = initialPosition;
// Y cambiamos la animación de nuevo a Idle
anim.SetLayerWeight (1, 0);
}
// Y un debug optativo con una línea hasta el target
Debug.DrawLine(transform.position, target, Color.green);
}
// Podemos dibujar el radio de visión y ataque sobre la escena dibujando una esfera
void OnDrawGizmosSelected() {
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, visionRadius);
Gizmos.DrawWireSphere(transform.position, attackRadius);
}
} thanks for you help. ,Hi i am making a 2d rpg but the enemies doesnt go to the player. This is my code using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Enemy : MonoBehaviour {
// Variables para gestionar el radio de visión, el de ataque y la velocidad
public float visionRadius;
public float attackRadius;
public float speed;
public Vector2 dir;
// Variable para guardar al jugador
GameObject player;
// Variable para guardar la posición inicial
Vector3 initialPosition;
// Animador y cuerpo cinemático con la rotación en Z congelada
Animator anim;
Rigidbody2D rb2d;
void Start () {
// Recuperamos al jugador gracias al Tag
player = GameObject.FindGameObjectWithTag("player");
// Guardamos nuestra posición inicial
initialPosition = transform.position;
anim = GetComponent<Animator>();
rb2d = GetComponent<Rigidbody2D>();
}
void Update () {
// Por defecto nuestro target siempre será nuestra posición inicial
Vector3 target = initialPosition;
// Comprobamos un Raycast del enemigo hasta el jugador
RaycastHit2D hit = Physics2D.Raycast(
transform.position,
player.transform.position - transform.position,
visionRadius,
1 << LayerMask.NameToLayer("Default")
// Poner el propio Enemy en una layer distinta a Default para evitar el raycast
// También poner al objeto Attack y al Prefab Slash una Layer Attack
// Sino los detectará como entorno y se mueve atrás al hacer ataques
);
// Aquí podemos debugear el Raycast
Vector3 forward = transform.TransformDirection(player.transform.position - transform.position);
Debug.DrawRay(transform.position, forward, Color.red);
// Si el Raycast encuentra al jugador lo ponemos de target
if (hit.collider != null) {
if (hit.collider.tag == "player"){
target = player.transform.position;
}
}
// Calculamos la distancia y dirección actual hasta el target
float distance = Vector3.Distance(target, transform.position);
Vector3 dir = (target - transform.position).normalized;
// Si es el enemigo y está en rango de ataque nos paramos y le atacamos
if (target != initialPosition && distance < attackRadius){
// Aquí le atacaríamos, pero por ahora simplemente cambiamos la animación
anim.SetFloat("x", dir.x);
anim.SetFloat("y", dir.y);
anim.SetBool("Atacando", true);
// Congela la animación de andar
}
// En caso contrario nos movemos hacia él
else {
rb2d.MovePosition(transform.position + dir * speed * Time.deltaTime);
// Al movernos establecemos la animación de movimiento
anim.speed = 2;
anim.SetFloat("x", dir.x);
anim.SetFloat("y", dir.y);
anim.SetLayerWeight(1, 1);
}
// Una última comprobación para evitar bugs forzando la posición inicial
if (target == initialPosition && distance < 0.02f){
transform.position = initialPosition;
// Y cambiamos la animación de nuevo a Idle
anim.SetLayerWeight (1, 0);
}
// Y un debug optativo con una línea hasta el target
Debug.DrawLine(transform.position, target, Color.green);
}
// Podemos dibujar el radio de visión y ataque sobre la escena dibujando una esfera
void OnDrawGizmosSelected() {
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, visionRadius);
Gizmos.DrawWireSphere(transform.position, attackRadius);
}
}
Thank for your help.
Comment
Your answer
Follow this Question
Related Questions
Can't change velocity on instantiated object 1 Answer
Why is my character slightly floating above the ground? 0 Answers
Raycast2D don't hit anything below 0 Answers
Unity2D Help with rigidbody character movement. 0 Answers
Boss ai help EoW 0 Answers