- Home /
Weird result using Spherecast
Hi, I try to make my enemy IA able to dodge but weird result happens : It's like the spherecast ignore the layermask?
Code of IA :
switch(enemy_state)
{
case enemyState.chasing:
agent.SetDestination(target.position);
break;
case enemyState.attacking:
agent.SetDestination(target.position);
lookingPlayer();
if(!alreadyAttacked)
{
Rigidbody rbProjectile = Instantiate(projectileEnemy, transform.position,
Quaternion.identity).GetComponent<Rigidbody>();
rbProjectile.velocity = new Vector3(0f, 0f, 0f);
rbProjectile.angularVelocity = new Vector3(0f, 0f, 0f);
rbProjectile.AddForce(transform.forward * 32f, ForceMode.Impulse);
rbProjectile.AddForce(transform.up * -0.8f, ForceMode.Impulse);
alreadyAttacked = true;
Invoke(nameof(ResetAttack), timeBetweenAttacks);
}
if(!currentlyDodging)
{
StartCoroutine("ScanBulletOfPlayer");
}
break;
case enemyState.Patroling:
if (!walkPoinset)
SearchWalkPoint();
if (walkPoinset)
agent.SetDestination(walkPoint);
Vector3 distanceToWalkPoint = transform.position - walkPoint;
if(distanceToWalkPoint.magnitude<1f)
{
walkPoinset = false;
}
break;
default:
break;
}
private IEnumerator ScanBulletOfPlayer()
{
float timefocused = 1.2f;
Vector3 forwardEnemy = transform.TransformDirection(Vector3.forward * 10);
Debug.DrawRay(transform.position, forwardEnemy, Color.blue);
RaycastHit hit;
int layerMask = 1 << 10;
float offsetmove = 3f;
if(Physics.SphereCast(forwardEnemy,4f,transform.forward,out hit, LayerBullet))
{
Debug.Log("bullet player hit !");
transform.position +=Vector3.right* offsetmove;
}
yield return new WaitForSeconds(timefocused);
currentlyDodging = true;
Invoke(nameof(ResetDodge), timeBetweenDodge);
}
private void ResetDodge()
{
currentlyDodging = false;
StartCoroutine("ScanBulletOfPlayer");
}
PS : transform.position +=Vector3.right* offsetmove;
is just for testing
Here is the result : Video of result
Hello, Did you tried to Debugg the SphereCast ? You can do that with Gizmos.DrawSphere ();
Hope it help
Answer by VironFlo · May 21, 2021 at 02:19 PM
Solved : I delete raycast stuff and remplace by this :
new Coroutine :
private IEnumerator ScanBulletOfPlayer()
{
float timeOfdodging = 0.8f;
yield return new WaitForSeconds(timeOfdodging);
currentlyDodging = true;
Invoke(nameof(ResetDodge), timeBetweenDodge);
}
the switch (dodging) :
if(!currentlyDodging)
{
currentMovedir = Random.Range(-1, 2);
Debug.Log(currentMovedir);
StartCoroutine("ScanBulletOfPlayer");
}
else
{
agent.Move(transform.right * currentMovedir);
}
Very clean result + no predictable + easier :)
Your answer
Follow this Question
Related Questions
2D Platformer - Picking Up Items & Storing Them C# 0 Answers
Collison detection not working? 1 Answer
Trigger is not detecting Player. (2D) 1 Answer
Collision without movement!?? 2 Answers
Activate trigger if items colected 1 Answer