Как повлиять только на 1 игровой объект в операторе if
Создание игры AI, пытаясь повлиять только на 1 игровой объект в операторе if. Я думаю, что то, как я это делаю, очень неправильно, и мне посоветовали создать массив моего экземпляра enum. Я просто не уверен, что это лучший способ. Это код, который у меня есть (очевидно, он неправильный, хотя, хотя он работает, он изменяет состояние всех игровых объектов, которые наследуются от моего класса DynamicAI).
DynamicAI.cs
using UnityEngine;
using System.Collections;
public class DynamicAIClass : MonoBehaviour {
public PlayerScript GO;
public Transform target;
public Transform myTransform2;
public GameObject bullet;
public GameObject Dyn1;
public GameObject Dyn2;
public GameObject Dyn3;
public GameObject Dyn4;
public int maxDistance;
int maxFireDis;
public int rotationSpeed;
public int moveSpeed;
bool StopDyn3;
bool StopDyn4;
public enum FollowAIStates
{
Stalk = 0,
Idle = 1
}
public FollowAIStates DynamicAI = FollowAIStates.Stalk;
void Awake() {
myTransform2 = transform;
}
// Use this for initialization
void Start () {
GO = GameObject.Find ("Player").GetComponent<PlayerScript>();
Dyn3 = GameObject.FindGameObjectWithTag ("Dyn3");
target = GO.transform;
maxDistance = 2;
maxFireDis = 1;
}
// Update is called once per frame
void Update () {
switch (DynamicAI)
{
case FollowAIStates.Stalk:
//handles rotation of AI
myTransform2.rotation = Quaternion.Slerp (myTransform2.rotation, Quaternion.LookRotation(target.position - myTransform2.position), rotationSpeed * Time.deltaTime);
if(Vector3.Distance(target.position, myTransform2.position) > maxDistance)
{
//Move towards target
myTransform2.position += myTransform2.forward * moveSpeed * Time.deltaTime;
}
if(Vector3.Distance(target.position, myTransform2.position) > maxFireDis)
{
//Shoots towards target
Instantiate(bullet, transform.position, transform.rotation);
}
if (Dyn3 && GO.transform.position.z > -0.0125f && GO.transform.position.x > -0.00107f)
{
Debug.Log ("STALK");
StopDyn3 = true;
}
else {
StopDyn3 = false;
}
/*if (Dyn4.activeInHierarchy == true && GO.transform.position.z < -0.0125f && GO.transform.position.x < -0.00107f)
{
Debug.Log ("STALK_DYN4");
StopDyn4 = true;
}
else {
StopDyn4 = false;
}*/
if (Dyn3 && !StopDyn3)
{
DynamicAI = FollowAIStates.Idle;
}
/*if (Dyn4 && !StopDyn4)
{
DynamicAI = FollowAIStates.Idle;
}*/
break;
case FollowAIStates.Idle:
if (Dyn3 && GO.transform.position.z > -0.0125f && GO.transform.position.x < -0.00107f)
{
Debug.Log ("IDLE");
DynamicAI = FollowAIStates.Stalk;
}
/*if (Dyn4 && GO.transform.position.z < -0.0125f && GO.transform.position.x < -0.00107f)
{
Debug.Log ("IDLE_DYN4");
DynamicAI = FollowAIStates.Stalk;
}*/
break;
}
}
}
2 ответа
На все ваши GameObjects влияют, потому что все они используют этот скрипт, поэтому этот код запускается в каждом GameObject. То есть Update()
Метод будет запускаться один раз в каждом GameObject, который имеет этот скрипт каждый цикл обновления.
То, как вы выполняете его только в одном или нескольких объектах GameObject, во многом зависит от того, что вы хотите сделать. Например, что делает один данный GameObject тем, который должен запускать код? Вы должны добавить логику, чтобы позволить запускать только нужный объект Update()
, как это:
void Update() {
if(!hasToken)
return;
// ...
}
И у вас будет другой скрипт, который будет передавать токен нужному GameObject.
Если я вас правильно понимаю... вы хотите использовать этот сценарий "DynamicAI.cs" для нескольких gameObjects, и если в коде оператор if-if применяется только к одному из объектов gameObject, использующих этот сценарий.
Вы можете идентифицировать объект в операторе if несколькими способами:
- Вы можете пометить или использовать слой в gameObject, а затем проверить наличие тега в операторе if
- Вы можете добавить логическое значение в скрипт, добавить его в оператор if и присвоить ему значение true только для одного игрового объекта, к которому вы хотите применить оператор if.
Проще всего было бы исключить этот код из сценария "DynamicAI.cs" и вставить его в другой сценарий. Затем просто прикрепите этот скрипт к одному игровому объекту.