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

Programming an enemy to shoot upwards

$
0
0
I am trying to program a RayCast enemy that shoots a laser. The problem with this code is that I can't get it to shoot upwards. I know it involves getting the y position of the player, but I just don't know how. using UnityEngine; using System.Collections; using UnityEngine.AI; public class EnemyAiTutorial : MonoBehaviour { [SerializeField] Transform enemy; [SerializeField] NavMeshAgent agent; [SerializeField] Transform player; [SerializeField] LayerMask whatIsGround, whatIsPlayer; [Space] //Patroling [SerializeField] Vector3 walkPoint; bool walkPointSet; [SerializeField] float walkPointRange; //Attacking [SerializeField] float timeBetweenAttacks; [SerializeField] bool isShooting; bool alreadyAttacked; [Space] //States [SerializeField] float sightRange, attackRange; [SerializeField] bool playerInSightRange, playerInAttackRange; [Space] [SerializeField] float delaySeconds = 1.5f; [SerializeField] bool fire; [SerializeField] float range = 100f; [SerializeField] float damage = 20f; [SerializeField] Vector3 characterOffSet = new Vector3(0f, 0.3f, 0); [SerializeField] Vector3 aimOffSet = new Vector3(0, 1, 0); private LineRenderer laser; bool fireLaser; #region Awake & Update functions private void Awake() { player = GameObject.Find("Player").transform; } public void Start() { laser = GetComponent(); } 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(); laser.SetPosition(0, enemy.transform.position + characterOffSet); if (!fireLaser) { laser.SetPosition(1, enemy.transform.position + characterOffSet); } } #endregion #region States 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.transform.position); } private void AttackPlayer() { //Make sure enemy doesn't move agent.SetDestination(transform.position); if (!isShooting) { Vector3 aimPlayer = player.transform.position + aimOffSet; transform.LookAt(aimPlayer); } if (!alreadyAttacked) { StartCoroutine(Shoot()); } } private void ResetAttack() { alreadyAttacked = false; } #endregion IEnumerator Shoot() { float totalTime = delaySeconds + timeBetweenAttacks; isShooting = true; yield return new WaitForSeconds(delaySeconds); fireLaser = true; RaycastHit Hit; while (!alreadyAttacked) { Vector3 onward = transform.TransformDirection(Vector3.forward) * (range); Debug.DrawRay(enemy.transform.position, onward, Color.red, 1f); if (Physics.Raycast(enemy.transform.position, enemy.transform.forward, out Hit, range)) { laser.SetPosition(1, Hit.point); Debug.Log(Hit.collider.name); if (Hit.collider.GetComponent() != null) { Hit.collider.GetComponent().TakeDamage(damage, Hit.point, Hit.normal); } else { Hit.collider.GetComponent().TakeDamage(damage, Hit.point, Hit.normal); } } else { laser.SetPosition(1, onward); } alreadyAttacked = true; } isShooting = false; yield return new WaitForSeconds(totalTime); fireLaser = false; alreadyAttacked = false; } }

Viewing all articles
Browse latest Browse all 1488

Trending Articles



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