2015-07-14 6 views
4

Я следую учебнику (точно survival shooter), и я нахожусь на стадии реализации NavMesh. Их первоначальный сценарий таков:Отслеживание трансформации игрового объекта - Почему использование FindGameObjectWithTag не работает?

Transform _player; 
NavMeshAgent nav; 

void Start() 
{ 
    _player = GameObject.FindGameObjectWithTag("Player").transform; 
    nav = GetComponent<NavMeshAgent>(); 
} 

void Update() 
{ 
    nav.SetDestination(_player.position);  
} 

Пока ничего особенного. Я нажимаю игру и, как ни странно, враг (у меня только один в данный момент на сцене) достигает начального положения игрока (0,0,0) вместо того, чтобы следить за ним, если игрок движется. Я понял, что позиция игрока не обновляется в поле _player, и он остается на 0,0,0.

Я пробовал другой подход: я перетащил игровой объект Игрока на свойство в пользовательском интерфейсе (сначала я сделал свойство публичным, и я изменил его на GameObject). В этом случае он работает безотказно:

GameObject _player; 
NavMeshAgent nav; 

void Start() 
{ 
    //Player is not retrieved here as before, but it's passed assigning the GameObject to the property directly through the UI 
    nav = GetComponent<NavMeshAgent>(); 
} 

void Update() 
{ 
    nav.SetDestination(_player.transform.position);  
} 

На этом этапе я задаюсь вопросом:

ли FindGameObjectWithTag метод сделать копию объекта, а не возвращает ссылку на GameObject? Почему это не работает в первом случае. Кстати, я использую Unity 5.

+0

Я воссоздал ситуацию, и я верю, что FindGameObjectWithTag() возвращает копию объекта в момент его вызова. Чтение документации по этому методу, похоже, подтверждает это, поскольку упоминание ссылки отсутствует. –

+0

Единственное, что у меня в голове, это то, что игровой объект неактивен в то время, так что FindGameObjectWithTag не обнаружит его. –

+1

Что-то, что стоит попробовать, это использовать ['FindGameObjectsWithTag'] (http://docs.unity3d.com/ScriptReference/GameObject.FindGameObjectsWithTag.html) и посмотреть, возвращено ли больше чем одна вещь. Возможно, тот, который вы получаете, подобен сборнику, который не движется или что-то еще. –

ответ

0

Я вижу много различных проблем, которые могут существовать в:

Так вот что вы должны тест:

  • Во-первых, вы должны попробовать: GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();

  • Если игрок геймобжекты имеет уникальное имя, попробуйте использовать

Transform playerTransform = GameObject.Find("MyPlayerName").transform

  • Если он все еще не работает, если этот скрипт назначить на плеер, вы можете получить доступ к геймобжектам с помощью this

  • Если ваш сценарий не присоединять к плееру gameobject, вы можете установить игровой объект игрока как открытый атрибут для вашего скрипта. А затем в редакторе возьмите игровой объект игрока и поместите его в правильный случай вашего атрибута класса. В этом случае ваше заявление должно быть:

public GameObject myPlayer;

  • Но перед тестированием любого из этих методов, вы должны проверить, если проблема возникает из GameObject.FindGameObjectWithTag, просто используя свое имя игрока в этом редакторе , Предположим, что имя игрока вашего игрового объекта - MyFantasticPlayer. Тогда попробуйте это:

    `GameObject myPlayer = GameObject.FindGameObjectWithTag("Player"); 
    if(myPlayer.name == "MyFantasticPlayer") 
    { 
        Debug.Log("Not problem with FindGameObjectWithTag"); 
    }else{ 
    Debug.Log("Problem"); 
    }` 
    

И если ваш журнал отладки говорит проблема, может быть, попытаться поймать исключение.

1

Возможно, у вас более 1 объекта с тегом «Player» в сцене. Я изменил свой код, чтобы обнаружить это условие.

Transform _player; 
NavMeshAgent nav; 

void Start() 
{ 
    GameObject[] playerObjects = GameObject.FindGameObjectsWithTag("Player"); 
    if(playerObjects.Length>1) 
    { 
     Debug.LogError("You have multiple player objects in the scene!"); 
    } 
    _player = playerObjects[0].transform; 
    nav = GetComponent<NavMeshAgent>(); 
} 

void Update() 
{ 
    nav.SetDestination(_player.position);  
} 

 Смежные вопросы

  • Нет связанных вопросов^_^