如何仅在if语句中影响1个游戏对象

时间:2014-02-24 20:16:30

标签: c# if-statement unity3d fsm

制作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;
    }
}
}

2 个答案:

答案 0 :(得分:2)

如果我理解正确...你想在多个gameObjects上使用这个脚本“DynamicAI.cs”,并且在代码中有一个if语句只适用于使用该脚本的一个gameObjects。

您可以通过多种方式在if语句中标识对象:

  • 您可以在gameObject上标记或使用图层,然后在if语句中检查标记
  • 您可以在脚本中放置一个布尔值,将其添加到if语句中,并且只在您希望应用if语句的一个gameObject中将其指定为true

最简单的方法是将该代码保留在“DynamicAI.cs”脚本之外,并将其放在另一个脚本中。然后将该脚本附加到一个gameObject。

答案 1 :(得分:1)

所有游戏对象都受到影响,因为它们都使用此脚本,因此此代码在每个GameObject中运行。也就是说,Update()方法将在每个更新周期都有此脚本的每个GameObject中运行一次。

你只在一个或一些GameObjects中运行它的方式很大程度上取决于你想要做什么。例如,是什么让一个给定的GameObject成为应该运行代码的那个?您应该添加一些逻辑以仅允许所需对象运行Update(),如下所示:

void Update() {
    if(!hasToken)
        return;
    // ...
}

你还有另一个脚本可以将令牌传递给正确的GameObject。