Problems with enemies
hi guys, i'm a newbie, and i was doing a enemy AI following THIS tutorial, i tried using a cube and it worked so i decided to replace it with my blender 3d model, but now when i come closer to my enemy he inclines away from me and shoots from he's feet (really weird), and i really can't understand why, so if someone could help me i would really appreciate it. here's a picture: and the code:
`
using UnityEngine;
using UnityEngine.AI;
public class EnemyAI : MonoBehaviour
{
public int damage = 20;
public NavMeshAgent agent;
//public Transform firePoint;
public Transform player;
public LayerMask whatIsGround, whatIsPlayer;
public float health;
//Patroling
public Vector3 walkPoint;
bool walkPointSet;
public float walkPointRange;
//Attacking
public float timeBetweenAttacks;
bool alreadyAttacked;
public GameObject projectile;
//States
public float sightRange, attackRange;
public bool playerInSightRange, playerInAttackRange;
private void Awake()
{
player = GameObject.Find("Player").transform;
agent = GetComponent<NavMeshAgent>();
}
private void Update()
{
//Check for sight and attack range
playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);
playerInAttackRange = Physics.CheckSphere(transform.position, attackRange, whatIsPlayer);
if (!playerInSightRange && !playerInAttackRange) Patroling();
if (playerInSightRange && !playerInAttackRange) ChasePlayer();
if (playerInAttackRange && playerInSightRange) AttackPlayer();
}
private void Patroling()
{
if (!walkPointSet) SearchWalkPoint();
if (walkPointSet)
agent.SetDestination(walkPoint);
Vector3 distanceToWalkPoint = transform.position - walkPoint;
//Walkpoint reached
if (distanceToWalkPoint.magnitude < 1f)
walkPointSet = false;
}
private void SearchWalkPoint()
{
//Calculate random point in range
float randomZ = Random.Range(-walkPointRange, walkPointRange);
float randomX = Random.Range(-walkPointRange, walkPointRange);
walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);
if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
walkPointSet = true;
}
private void ChasePlayer()
{
agent.SetDestination(player.position);
}
private void AttackPlayer()
{
//Make sure enemy doesn't move
agent.SetDestination(transform.position);
transform.LookAt(player);
//firePoint.LookAt(player);
if (!alreadyAttacked)
{
///Attack code here
Rigidbody rb = Instantiate(projectile, transform.position, Quaternion.identity).GetComponent<Rigidbody>();
rb.AddForce(transform.forward * 32f, ForceMode.Impulse);
rb.AddForce(transform.up * 8f, ForceMode.Impulse);
///End of attack code
alreadyAttacked = true;
Invoke(nameof(ResetAttack), timeBetweenAttacks);
}
}
private void ResetAttack()
{
alreadyAttacked = false;
}
private void DestroyEnemy()
{
Destroy(gameObject);
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, attackRange);
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, sightRange);
}
}`
thanks in advance for the help :)
Answer by streeetwalker · Sep 13, 2020 at 08:14 AM
HI @Foca, in your image it is obvious that the enemy is not leaning at all, so that must be a perspective effect. If the enemy is huge relative to the scene window size, you'll get exaggerated foreshortening like that. In your camera inspector, adjust the FOV and/or check "physical camera" - should relieve the exaggerated perspective. Also you can scale the enemy down in its inspector.
For issue of firing from its feet, the pivot of the object must be at its feet. Anything your code generates using the enemy position will start there.
The easiest way to remedy this issue by offsetting the point at which the projectile is instantiate. For example:
Vector3 offset = new Vector3( 0, 0, -2f );
// spawn -2f in the up direction from current the enemy pivot position
Rigidbody rb = Instantiate( projectile, transform.position + offset, Quaternion.identity ).GetComponent<Rigidbody>();
You'll have to fiddle with the offset.
hi, thanks for the reply, but the problem of the character leaning is not perspective's fault ... I can tell by looking at it from the scene view and i think is still pivot's fault, so knowing this how can I solve it? thanks In this photo is easier to see it:
@Foca, ah yes, sorry, In the original scene view was from behind and it was deceiving.
You could go back to the original modeling program and try to correct the issue there.
Barring that, it may be better to create an empty game object where the transform is completely zeroed out, and place your model inside of that - make the enemy a child of the empty game object in the hierarchy. That way you can position and rotate the child how ever you want in its parent.
This is a very common thing to do for reasons such as your situation, and a whole lot of other reasons.
Then you just need to make sure your code references the parent object for all movement and what not, and everything will still work the same way. I guess you'd want to move the script to the parent.
Your answer
Follow this Question
Related Questions
Problems with enemies and animations 0 Answers
How to move an object across terrain? 0 Answers
OverslapSphere dont detect enemyhealth 0 Answers
Something wrong with enemy tilting in space shooter extending tutorial? 0 Answers
2D Roguelike Enemy in Walls 2 Answers