2015-11-11 10 views
5

Mam problem ze znalezieniem zmiennej ze skryptu z innego GameObject. Używałem tego typu referowania wcześniej i wiem jak to działa, ale z jakiegoś powodu mówi, że nie może znaleźć skrypt, do którego się odnawiam.Unity nie może znaleźć skryptu innego GameObject

Kod, który odnosi się do innego kodu (jeśli sprawozdania na początku CanHearPlayer()):

using UnityEngine; 
using System.Collections; 

public class EnemySight : MonoBehaviour { 

public GameObject Player; 
public float fieldOfViewDegrees = 30; 
public float visibilityDistance = 50; 
public bool SeeingPlayer; 
public float deathDistance; 
public float hearDistance; 

void Update(){ 
    SeeingPlayer = CanSeePlayer(); 
    float Distance = Vector3.Distance(transform.position, Player.transform.position); 

    if ((SeeingPlayer == true)) { 
     transform.LookAt(Player.transform.position); 

     if (Distance < deathDistance){ 
      Debug.Log("You died"); 
      //Game over sequence starts here 
     } 
    } 

    if (CanHearPlayer() == true) { 
     Debug.Log ("I can hear you."); 
    } 
} 

protected bool CanSeePlayer() 
{ 
    RaycastHit hit; 
    Vector3 rayDirection = Player.transform.position - transform.position; 

    if ((Vector3.Angle(rayDirection, transform.forward)) <= fieldOfViewDegrees * 0.5f) 
    { 
     // Detect if player is within the field of view 
     if (Physics.Raycast(transform.position, rayDirection, out hit, visibilityDistance)) 
     { 
      return (hit.transform.CompareTag("Player")); 
     } 
    } 

    return false; 
} 

protected bool CanHearPlayer(){ 

    RaycastHit hit; 
    Vector3 rayDirection = Player.transform.position - transform.position; 

    if (Player.GetComponent<FirstPersonController>().MakingWalkingSound == true) { 
     hearDistance = 50; 
    } else { 
     hearDistance = 5; 
    } 

    if (Player.GetComponent<FirstPersonController>().MakingRunningSound == true) { 
     hearDistance = 100; 
    } 

    if (Physics.Raycast(transform.position, rayDirection, out hit, hearDistance)) 
    { 
     return (hit.transform.CompareTag("Player")); 
    } 
    return false; 
} 

}

GameObject publicznego „Gracz” jest zdefiniowane w Jedności jako przedmiot który zawiera skrypt "FirstPersonController" jako składnik.

Code to odnosi się do części (IT):

public class FirstPersonController : MonoBehaviour 
{ 
    public bool MakingWalkingSound; 
    public bool MakingRunningSound; 

private void GetInput(out float speed) 
{ 
    // Read input 
    float horizontal = CrossPlatformInputManager.GetAxis("Horizontal"); 
    float vertical = CrossPlatformInputManager.GetAxis("Vertical"); 
    MakingWalkingSound = !(horizontal == 0 && vertical == 0); 

    MakingRunningSound = Input.GetKey(KeyCode.LeftShift); 
} 

Błędy odczytu: aktywa/EnemySight.cs (53,41): error CS0246: Typ lub obszaru nazw 'FirstPersonController' nie mógł być znalezionym. Brakuje dyrektywy użycia lub odwołania do zespołu? I: Assets/EnemySight.cs (59,41): error CS0246: Nie można znaleźć nazwy typu ani nazwy przestrzeni "FirstPersonController". Brakuje dyrektywy użycia lub odwołania do zespołu?

Te linie odpowiadają pierwszym dwóm instrukcjom if w CanHearPlayer.

Co robię źle? Szukałem w Google i StackOverflow, ale nie mogę znaleźć problemu.

Dzięki!

+0

To dziwne, że zgłasza błąd w liniach 53 i 59, gdy w EnemySight.cs nie ma zbyt wielu linii. Czy na pewno wkleiłeś właściwy plik? Jest FirstPersonController w swoim własnym pliku - powinno być. – peterept

+0

Dziękuję za odpowiedź! EnemySight też się skraca, nie wspomniałem o tym. Ale tak jak powiedziałem, błędy odnoszą się do instrukcji if w CanHearPlayer. – Timmeh

+0

Kiedy mówisz "skrócone", czy w jakimś pliku pominięto dyrektywę dotyczącą przestrzeni nazw? – peterept

Odpowiedz

3

Jeśli istnieje deklaracja przestrzeni nazw w klasie FirstPersonController, musisz zadeklarować użycie kodu EnemySight. Podobnie jak:

namespace MyNamespace.Blah { 
    public class FirstPersonController : MonoBehaviour { 
     ... 
    } 
} 

i ...

using MyNamespace.Blah; 

public class EnemySight : MonoBehaviour { 
    ... 
} 

dla MonoDevelop można użyć ALT + SPACJA podczas deklarowania klas, które nie są już w swojej wykorzystaniem zakresu i zostanie on umieszczony na górze za pomocą klasy dla Ciebie.

Powiązane problemy