代码之家  ›  专栏  ›  技术社区  ›  user2344665

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

  •  0
  • user2344665  · 技术社区  · 12 年前

    制作一个AI游戏,试图只影响if语句中的1个游戏对象。我认为我这样做是非常错误的,有人建议我创建枚举实例的数组。我只是不确定最好的解决方法。这是我的代码(显然是错误的,尽管它确实有效,但它改变了从DynamicAI类继承的所有游戏对象的状态)。

    动态AI.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 回复  |  直到 12 年前
        1
  •  2
  •   AnxGotta    12 年前

    如果我正确理解你。。。您希望在多个gameObjects上使用此脚本“DynamicAI.cs”,并且代码中的if语句仅适用于使用该脚本的一个gameObject。

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

    • 您可以标记或使用gameObject上的层,然后在if语句中检查标记
    • 您可以在脚本中放入一个布尔值,将其添加到if语句中,并仅在要应用if语句的一个gameObject中将其赋值为true

    最简单的方法是将该代码从“DynamicAI.cs”脚本中删除,并将其放到另一个脚本中。然后只需将该脚本附加到一个gameObject。

        2
  •  1
  •   Roberto ragul ml    12 年前

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

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

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

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