Jump to content
Unity Insider Forum

Enemy-Movement


Crashdash

Recommended Posts

Hallo ihr,

 

ich bin Informatikstudent und habe mir Unity zugelegt, um "spielerisch" mit C# warm zu werden.

Ich nutze Photon für die Netzwerkkommunikation.

 

Zu meiner Frage:

Ich habe ein PlayerPrefab, dass beim Serverstart erstellt wird,

Und einen netten Drachen(Gegner) der 5 Sekunden nach dem Serverstart spawned.

Ich versuche, dass der Drache den Tag des Players findet, seine Position lokalisiert und sich zu ihm bewegt, so bald der Abstand der beiden kleiner als 20 ist.

Im Lokalen Spiel, findet er ihn sofort mit meinem Script und bewegt sich auf ihn zu, greift ihn dann an, etc. Im Multiplayer schaff ich es einfach nicht

Lange Rede, kurzer Sinn:

Wie findet der Drache meine verbundenen Spieler?

 

Script des Drachen:

 void Awake()
    {

     //Sende RPC um Clients nach playertag zu fragen

       photonView.RPC("playertag", PhotonTargets.All, gameObject.tag);

        Debug.Log("Found Player");
       

       //Distance zwischen Spieler und Drache

        float dist = Vector3.Distance(Enemy1.position, player.position);

        if (GameObject.FindGameObjectsWithTag("PlayerObject").Length > 0)                      //Fehlercode: NullReferenceException: Object reference not set to an instance of an object
                                                                                                                                                          EnemyMovement.Awake () (at Assets/Scripts 1/EnemyScripts/EnemyMovement.cs:35)


        {
            //Wenn Gegner und Drache noch leben...
            if (enemyHealth.currenthealth > 0 && playerHealth.currHealth > 0)

            {
                if (dist < 20 || Dmg == true)
                {
                    // setze das Ziel des Nav.Mesh auf Player
                    nav.enabled = true;
                    nav.SetDestination(player.position);
                    transform.LookAt(player.position);

                    if (nav.remainingDistance < 11)
                    {
                        Running2.SetBool("Running", false);
                    }

                    else
                    {
                        Running2.SetBool("Running", true);
                    }
                }
             

  
                else
                {
                    // ... disable the nav mesh agent.
                    nav.enabled = false;
                    Running2.SetBool("Running", false);

 

 

 

Playerscript:

public class Player : Photon.MonoBehaviour
{

    [PunRPC]
    void playertag(string text)
    {
        this.tag = text;

    }
        }

 

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast da 2 Dinge, die nicht so recht passen.

Einmal ist da ein Timingproblem, denn dein Drache fragt einzig und allein in der Awake, ob denn en Player da ist.
Wenn der Player aber zu diesem Zeitpunkt nicht da ist, dann läuft all der nachfolgende Code ins Leere. Dein Drache sollte also zyklisch weiter suchen, falls in der Awake noch nichts gefunden wurde.

Dann hast du den GO Befehl FindGameObjectsWithTag. Das heisst, du suchst nach mehreren Playern die in ein Array geschoben würden, wenn du welche findest. Du hast aber kein Array dafür definiert und wirst dann wohl auch keine länge zurück bekommen
Wenn du das so machen willst dann schau dir dieses Beispiel mal an:

https://docs.unity3d.com/ScriptReference/GameObject.FindGameObjectsWithTag.html

Suchst du aber nur nach einen Player, dann solltest du FindWithTag nutzen:

https://docs.unity3d.com/ScriptReference/GameObject.FindWithTag.html

 

Ach so:

Willkommen! :)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...