- Home /
C# AI, Enemy is flying at me when I jump.
I have a C# AI script it works but when i jump the enemy is following me up in the air so its flying while attacking. Here is the script:
using UnityEngine;
using System.Collections;
public class EnemyAI : MonoBehaviour {
public Transform target;
public int moveSpeed;
public int rotationSpeed;
public bool inTrigger;
public int maxDistance;
private Transform myTransform;
void Awake() {
myTransform = transform;
}
// Use this for initialization
void Start() {
GameObject go = GameObject.FindGameObjectWithTag("Player");
target = go.transform;
maxDistance = 2;
}
// Update is called once per frame
void Update() {
if(inTrigger){
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
if(Vector3.Distance(target.position, myTransform.position) > maxDistance){
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
}
}
}
void OnTriggerEnter(Collider other) {
inTrigger = true;
}
void OnTriggerExit(Collider other) {
inTrigger = false;
}
}
is there any way to fix this?
Once I'm approved i've made an answer that will solve your problem
Answer by ausiemick · Oct 07, 2012 at 08:56 PM
void Update() {
if(inTrigger){
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
if(Vector3.Distance(target.position, myTransform.position) > maxDistance){
// my code
Vector3 xzFoward = myTransform.forward;
xzFoward.y = 0.0f;
xzFoward = xzFoward.Normalize();
//end of my code
myTransform.position += xzFoward * moveSpeed * Time.deltaTime; // use xzFowared instead of myTransform
}
}
}
Vector3 xzFoward = myTransform.forward; // makes a coppy of your foward xzFoward.y = 0.0f; // removes y (up) component) xzFoward = xzFoward.Normalize(); // makes x/z slightly larger so that total magnatude once again == 1.0 (myTransform.forward's magnatude is 1.0)
the part where I re-normalise it is the part allot of people forget.. if you don't do that as you go higher they will slow down as they are still moving up, it just cancels the up movement, when you use a foward vector to multiply through your data, you must always make sure that it's normalised, so if you remove an axis it once again must be normalised
so to break it down
make a coppy of the foward vector remove the component you don't want (i.e. y) renormalise the vector to be 1.0 so that when you multiply it it correctly
I havn't tested this on a moving object, so theres a chance Ive made a logical error, but from experience this should work (plus I added debug logs allong each step to check it was doing the right thing.. It was
Answer by 99thmonkey · Dec 31, 2012 at 05:39 PM
transform.Translate and transform.position will move your flying object through colliders. Use .Move instead.
Your answer
Follow this Question
Related Questions
How can I more optimize My AI Script 0 Answers
Multiple Cars not working 1 Answer
Enemy following Player on uneven surface 1 Answer