- Home /
I cant make a transform get a random position?
I am making a simple AI, and I want it to follow the player while its inside its radius, but as soon as you go out, he starts wandering in a random direction. I thought this would work since its gieting a random position every second, but the transform doesnt seem to be able to get a random position. Any Ideas?
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class GruntAI : MonoBehaviour {
public float moveSpeed;
public float shootSpeed;
public bool inRange;
private bool canGen;
private Transform playerPostion;
private Transform randPosition;
// Use this for initialization
void Start () {
playerPostion = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
inRange = false;
canGen = true;
randPosition.position = new Vector2(Random.Range(1, 15), Random.Range(1, 15));
}
// Update is called once per frame
void Update () {
if (inRange == true)
{
transform.position = Vector2.MoveTowards(transform.position, playerPostion.position, moveSpeed * Time.deltaTime);
} else
{
transform.position = Vector2.MoveTowards(transform.position, randPosition.position, moveSpeed * Time.deltaTime);
}
if (canGen == true)
{
StartCoroutine(generatePosition());
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
inRange = true;
}
private void OnTriggerExit2D(Collider2D collision)
{
inRange = false;
}
IEnumerator generatePosition()
{
canGen = false;
randPosition.position = new Vector2(Random.Range(1, 15), Random.Range(1, 15));
yield return new WaitForSeconds(1);
canGen = true;
}
}
Hi, it seems to me a good script. What exactly doesn’t work? In the inspector is the randPosition changing? And the inRange variable? Isn’t it better to add a tag to the OnCollisionEnter? Like if (collision.gameObject.tag == “PlayerRange”) so if you have another object set to trigger it doesn’t set the variable to true. And ins$$anonymous$$d using a coroutine i think you could use a InvokeRepeating that calls a function every x seconds.
So the issue is that as soon as you move out of range the enemy stops dead and doesn't move. I get the inspector error "null reference exeption" everything works its seems like there is no defenition for randPosition even through I am setting it
Answer by MT369MT · Jun 08, 2018 at 09:24 PM
I think that the error is that you decleared your randPosition like a Transform. A Transform is a Component of a GameObject. Try using Vector2 instead.
public float moveSpeed;
public float shootSpeed;
public bool inRange;
private bool canGen;
private Transform playerPostion;
private Vector2 randPosition;
// Use this for initialization
void Start () {
playerPostion = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
inRange = false;
canGen = true;
randPosition = new Vector2(Random.Range(1, 15), Random.Range(1, 15));
}
// Update is called once per frame
void Update () {
if (inRange == true)
{
transform.position = Vector2.MoveTowards(transform.position, playerPostion.position, moveSpeed * Time.deltaTime);
} else
{
transform.position = Vector2.MoveTowards(transform.position, randPosition, moveSpeed * Time.deltaTime);
}
if (canGen == true)
{
StartCoroutine(generatePosition());
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
inRange = true;
}
private void OnTriggerExit2D(Collider2D collision)
{
inRange = false;
}
IEnumerator generatePosition()
{
canGen = false;
randPosition = new Vector2(Random.Range(1, 15), Random.Range(1, 15));
yield return new WaitForSeconds(1);
canGen = true;
}
Not sure it works. Try it and say if it works.
Your answer
![](https://koobas.hobune.stream/wayback/20220612164409im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Random Movement : 2d 1 Answer
Random Movement? 1 Answer
Problem in player movement using accelerometer input 0 Answers
How to calculate distance between objects? 5 Answers
Ball Cont. Moving Despite transform.parent Stopping 0 Answers