2015-11-11 6 views
5

Ich habe ein Problem, eine Variable vom Skript von einem anderen GameObject zu erhalten. Ich habe diese Art des Verweisens vorher benutzt und ich weiß, wie es funktioniert, aber aus irgendeinem Grund sagt es, dass es nicht finden kann das Skript, auf das ich mich beziehe.Einheit kann Skript von anderem GameObject nicht finden

Der Code, der (wenn Aussagen zu Beginn der CanHearPlayer()) zu dem anderen Code verweist:

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

}

Der öffentliche Gameobject 'Spieler' definiert ist, in Unity als Objekt enthält das Skript 'FirstPersonController' als Komponente.

-Code wird unter Bezugnahme auf (ein Teil davon):

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); 
} 

Die Fehler lesen: Aktiva/EnemySight.cs (53,41): Fehler CS0246: Der Typ oder Namespace-Name 'FirstPersonController' konnte nicht gefunden werden. Vermissen Sie eine using-Direktive oder eine Assembly-Referenz? Und: Assets/EnemySight.cs (59,41): Fehler CS0246: Der Typ oder Namespace-Name 'FirstPersonController' konnte nicht gefunden werden. Vermissen Sie eine using-Direktive oder eine Assembly-Referenz?

Diese Zeilen entsprechen den ersten beiden if-Anweisungen in CanHearPlayer.

Was mache ich falsch? Ich habe auf Google und StackOverflow gesucht, aber ich kann nicht finden, was das Problem ist.

Danke!

+0

Es ist seltsam, dass es den Fehler in den Zeilen 53 und 59 meldet, wenn es in EnemySight.cs nicht so viele Zeilen gibt. Bist du sicher, dass du die richtige Datei eingefügt hast? Ist FirstPersonController in seiner eigenen Datei - sollte es sein. – peterept

+0

Vielen Dank für Ihre Antwort! EnemySight ist auch etwas kürzer, das habe ich nicht erwähnt. Aber wie gesagt, die Fehler beziehen sich auf die if-Anweisungen in CanHearPlayer. – Timmeh

+0

Wenn Sie verkürzt sagen, haben Sie eine Namespace-Direktive in beiden Dateien weglassen? – peterept

Antwort

3

Wenn es eine Namespace-Deklaration für Ihre FirstPersonController-Klasse gibt, müssen Sie die Deklaration auf Ihrem EnemySight-Code deklarieren. Genau wie:

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

und ...

using MyNamespace.Blah; 

public class EnemySight : MonoBehaviour { 
    ... 
} 

für monodevelop Sie Alt + Leertaste bei der Deklaration Klassen verwenden können, die nicht bereits in der Verwendung von Rahmen sind, und es wird mit an der Spitze der Klasse platzieren für dich.

Verwandte Themen