制作AI游戏,尝试仅在if语句中影响1个游戏对象。我认为我这样做的方式是非常错误的,我被建议创建一个我的枚举实例的数组。我只是不确定最好的办法。这是我的代码(显然它是错的,虽然它确实有效,它改变了从我的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;
}
}
}
答案 0 :(得分:2)
如果我理解正确...你想在多个gameObjects上使用这个脚本“DynamicAI.cs”,并且在代码中有一个if语句只适用于使用该脚本的一个gameObjects。
您可以通过多种方式在if语句中标识对象:
最简单的方法是将该代码保留在“DynamicAI.cs”脚本之外,并将其放在另一个脚本中。然后将该脚本附加到一个gameObject。
答案 1 :(得分:1)
所有游戏对象都受到影响,因为它们都使用此脚本,因此此代码在每个GameObject中运行。也就是说,Update()
方法将在每个更新周期都有此脚本的每个GameObject中运行一次。
你只在一个或一些GameObjects中运行它的方式很大程度上取决于你想要做什么。例如,是什么让一个给定的GameObject成为应该运行代码的那个?您应该添加一些逻辑以仅允许所需对象运行Update()
,如下所示:
void Update() {
if(!hasToken)
return;
// ...
}
你还有另一个脚本可以将令牌传递给正确的GameObject。