MissingReferenceException: Das Objekt des Typs 'GameObject' wurde zerstört, aber Sie sind immer noch versuchen, darauf zugreifen (FEHLER)

Ich habe ein problem, dass die iv versucht herauszufinden für ein paar sagt, und ich kann nicht scheinen, um pin-point die Ursache davon! Habe ich einen first-person-shooter, der aus ein paar Feinde auf eine kleine Karte. Ich habe zwei Szenen (das Hauptmenü und das Spiel-level). Wenn mein Spieler stirbt, ist es braucht, um das Haupt-Menü, aus dem Sie wählen können, um das Spiel noch einmal spielen. Diese dann lädt das level wieder. Das erste mal, das Spiel wird laufen, es läuft ohne Probleme. Allerdings, wenn ich doe und drücken Sie die play game-Taste erneut, es gibt mir eine Meldung, die besagt Folgendes "MissingReferenceException: Das Objekt des Typs 'GameObject' wurde zerstört, aber Sie sind immer noch versuchen, ihn zu erreichen." aus dem code unten sehe ich nur zwei Arten, die von GameObject. Ich habe versucht zu entfernen, die muzzleFlash zu sehen, wenn das ist die Frage macht es allerdings keinen Unterschied. Ich habe die Häkchen alle statischen Feldern, wie ich gelesen habe, dass dies möglicherweise die Ursache des Problems, aber dies das problem nicht behoben. dieses script unten angehängt ist ein Feind, ich habe eine PlayerShot Skript angebracht, um die FPS. Könnte bitte jemand helfen?

//speed of the AI player
public var speed:int = 5;

//speed the ai player rotates by
public var rotationSpeed:int = 3;

//the waypoints
public var waypoints:Transform[];

//current waypoint id
private var waypointId:int = 0;

//the player
public var player:GameObject;

//firing toggle
private var firing:boolean = false;

//the Mesh Renderer of the Muzzle Flash GameObject
private var muzzleFlashAgent:GameObject;


/**
    Start
*/
function Start() 
{
    //retrieve the player
    player = GameObject.Find("First Person Controller");

    //retrieve the muzzle flash
    muzzleFlashAgent = GameObject.Find("muzzleFlashAgent");

    //disable the muzzle flash renderer
    muzzleFlashAgent.active = false;
}

/**
    Patrol around the waypoints
*/
function Patrol()
{
    //if no waypoints have been assigned
    if (waypoints.Length == 0) 
    {
        print("You need to assign some waypoints within the Inspector");
        return;
    }

    //if distance to waypoint is less than 2 metres then start heading toward next waypoint
    if (Vector3.Distance(waypoints[waypointId].position, transform.position) < 2)
    {
        //increase waypoint id
        waypointId++;

        //make sure new waypointId isn't greater than number of waypoints
        //if it is then set waypointId to 0 to head towards first waypoint again
        if (waypointId >= waypoints.Length) waypointId = 0;
    }

    //move towards the current waypointId's position
    MoveTowards(waypoints[waypointId].position);
}

/**
    Move towards the targetPosition
*/
function MoveTowards(targetPosition:Vector3)
{
    //calculate the direction
    var direction:Vector3 = targetPosition - transform.position;

    //rotate over time to face the target rotation - Quaternion.LookRotation(direction)
    transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);

    //set the x and z axis of rotation to 0 so the soldier stands upright (otherwise equals REALLY bad leaning)
    transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);

    //use the CharacterController Component's SimpleMove(...) function
    //multiply the soldiers forward vector by the speed to move the AI
    GetComponent (CharacterController).SimpleMove(transform.forward * speed);

    //play the walking animation
    animation.Play("walk");
}


/**
    Update
*/
function Update()
{
    //calculate the distance to the player
    var distanceToPlayer:int = Vector3.Distance(transform.position, player.transform.position);

    //calculate vector direction to the player
    var directionToPlayer:Vector3 = transform.position - player.transform.position;

    //calculate the angle between AI forward vector and direction toward player
    //we use Mathf.Abs to store the absolute value (i.e. always positive)
    var angle:int = Mathf.Abs(Vector3.Angle(transform.forward, directionToPlayer));

    //if player is within 30m and angle is greater than 130 (IN FRONT) then begin chasing the player
    if (distanceToPlayer < 30 && angle > 130)
    {
        //move towards the players position
        MoveTowards(player.transform.position);

        //if not firing then start firing!
        if (!firing) Fire();
    }
    //if player is within 5m and BEHIND then begin chasing
    else if (distanceToPlayer < 5 && angle < 130)
    {
        //move towards the players position
        MoveTowards(player.transform.position);

        //if not firing then start firing!
        if (!firing) Fire();
    }
    else
    {
        //patrol
        Patrol(); 

        //stop firing
        firing = false;
    }
}

/**
    Fire at the player
*/
function Fire()
{
    //toggle firing on
    firing = true;

    //check if still firing
    while (firing)
    {
        //hit variable for RayCasting
        var hit:RaycastHit;

        //range of weapon
        var range:int = 30;

        //fire the ray from our position of our muzzle flash, forwards "range" metres and store whatever is detected in the variable "hit"
        if (Physics.Raycast(muzzleFlashAgent.transform.position, transform.forward, hit, range)) 
        {
            //draw a line in the scene so we can see what's going on
            Debug.DrawLine (muzzleFlashAgent.transform.position, hit.point);

            //if we hit the player
            if (hit.transform.name == "First Person Controller")
            {
                //inform the player that they have been shot
                player.GetComponent(PlayerShot).Shot();  

                //play gunshot sound
                audio.PlayOneShot(audio.clip);


                //show muzzle flash for X seconds
                muzzleFlashAgent.active = true;
                yield WaitForSeconds(0.05);
                muzzleFlashAgent.active = false; 

                //wait a second or two before firing again
                yield WaitForSeconds(Random.Range(1.0, 2.0));
            }
        }

        //wait till next frame to test again
        yield;
    }
}

dies ist die PlayerShot die zerstört das gameobject.

//the sound to play when the player is shot
public var shotSound:AudioClip;



//the number of lives
public var lives:int = 3;


/**
    Player has been shot
*/
function Shot () 
{
    //play the shot audio clip
    audio.PlayOneShot(shotSound);

    //reduce lives
    lives--;

    //reload the level if no lives left
    if (lives == 0)
    {
        //destroy the crosshair
        Destroy(GetComponent(CrossHair));


        //add the camera fade (black by default)
        iTween.CameraFadeAdd();

        //fade the transparency to 1 over 1 second and reload scene once complete
        iTween.CameraFadeTo(iTween.Hash("amount", 1, "time", 1, "oncomplete", "ReloadScene", "oncompletetarget", gameObject));
    }
}


/**
    Reload the scene
*/
function ReloadScene()
{
    //reload scene
    Application.LoadLevel("MainMenu");
}

Dem Skript angebracht, um den Feind zusammen mit den BasicAI ist die SoldierShot Skript zerstört das gameobject. unten ist das script.

public var ragdoll:GameObject;

/**
    Function called to kill the soldier
*/
function Shot()
{
    //instantiate the ragdoll at this transform's position and rotation
    Instantiate(ragdoll, transform.position, transform.rotation);

    Destroy(GetComponent(BasicAI));
    //destroy the animated soldier gameobject
    Destroy(gameObject);

}
InformationsquelleAutor user1270217 | 2012-04-18
Schreibe einen Kommentar