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);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es scheint, dass Sie halten eine Referenz auf das GameObject zerstört (oder bin ich da falsch?).
Im Gegensatz zu dem, was in gemeinsamen C# (und wahrscheinlich javascript) Programme, wenn Sie einen Verweis auf ein Objekt, wird es nie werden, Müll gesammelt, in der Einheit, wenn Sie das Objekt löschen, werden alle Ihre Referenzen werden auf
null
.Easy fix, können Sie löschen Sie das gameObject in die "Spiel Ebene" und instanziieren Sie Ihre Soldaten auf dem Fliegen mit:
Die Sie gerade brauchen, um einen Ressourcen-Ordner im Projekt Ordner an, und stellen Sie das Fertighaus für Ihre lot hinein.