• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nie mogę uzyć komendy SendMessage w Unity

VPS Starter Arubacloud
0 głosów
146 wizyt
pytanie zadane 1 września 2019 w C# przez Bezy Bywalec (2,280 p.)
edycja 1 września 2019 przez Bezy

Chcę wysłać wiadomość o odjęciu hp 

Skrypt na enemii

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyAiNew : MonoBehaviour
{
    public float walkSpeed = 5.0f; // poruszanie sie 
    public float attackDistance = 2.0f; // odleglosc z jaka mozemy zaatakowac 
    public float attackDemage = 10.0f;
    public float attackDelay = 1.0f;//opóźnienei ataku 

    public float timer = 0;

     void OnTriggerStay(Collider other) // ten void wykonuje sie tyle razy jak collider wykrywa kolizje || Equals to jest "=" || jesli inny collider to Player wtedy
    {
        if (other.tag.Equals("Player"))
        {
            //quaternion to znaczy od i do || zaznaczenie obiektu, obiekt quaternion  || zaznaczenie obiektu target rotation || Look rotation jest to patrzenie w daną stronę 
            Quaternion targetRotation = Quaternion.LookRotation(other.transform.position - transform.position);
           float oryginalX = transform.rotation.x; //te dwie zmienne zapamietuja rotacje jaka jest przed obroceniem 
           float oryginalZ = transform.rotation.z;//


            //quaternionr slerp pozwala nam powoli zmienic parametry obrotu
            //parametr rotacji, rotacja do przeciwnika 
            Quaternion finalRotation = Quaternion.Slerp(transform.rotation, targetRotation, 5.0f* Time.deltaTime); // trzeba pomnozyc przez 5 sekund * czas ponieważ samo 5.0f nic nie znaczy 
           finalRotation.x = oryginalX; // tutaj jest ta sama rotacja co poprzednio dlatego obiekt sie nie obraca ??
           finalRotation.z = oryginalZ;
            transform.rotation = finalRotation;


            //vector 3 - zwraca odleglosc miedzy a i b     
            //                     pozycja naszego o,   pozycja gracza   - jako other 
            float distance = Vector3.Distance(transform.position, other.transform.position);// miedzy obiektem a i b 
            if (distance > attackDistance)
            {
                transform.Translate(Vector3.forward * walkSpeed * Time.deltaTime); //TRANSLATE - przesuwa pozycje w kierunku wskazanym czyli
            }
            else                   // 3 kratki * szybkośc chodzenia * czas 
            {
                if (timer <= 0) { // jesli timer mniejszy od 0 wtedy
                    other.SendMessage("takeHit", attackDemage); // wyslij metode 
                    timer = attackDelay;
                }
            }
            if (timer > 0) { // jesli timer jest wiekszy od zera wtedy od czasu rzeczywistego odejmij 1 sekunde
                timer -= Time.deltaTime;

            }


        }
    }


}

Skrpyt na Pasek mojego zdrowia

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerStats : MonoBehaviour
{
    private float maxHealth=100;
    private float currentHealth=100;

    private float maxArmour=100;
    private float currentArmour=100;

    public Texture2D healthTexture;
    public Texture2D armourTexture;

    private float barHeigth;
    private float barWidth;

    private float canHeal = 0.0f;
    private float canRegenerate = 0.0f;
    void Awake()
    {
        barHeigth = Screen.width * 0.01f;
        barWidth = Screen.width * 0.15f;
    }
     void OnGUI()
    {
        GUI.DrawTexture(new Rect(Screen.width - barWidth - 10,
            Screen.height - barHeigth - 10,
            currentHealth * barWidth / maxHealth,
            barHeigth), healthTexture);

        GUI.DrawTexture(new Rect(Screen.width - barWidth - 10,
                           Screen.height - barHeigth * 2 - 20,
                           currentArmour * barWidth / maxArmour,
                          barHeigth),
                  armourTexture);
    }
    void takeHit(float demage)
    {
        if (currentHealth < maxHealth) {
            canHeal = 5.0f;
        }

        if (currentArmour > 0)
        {
            currentArmour -= demage;

            if (currentArmour < 0)
            {
                currentHealth += currentArmour;
                currentArmour = 0;
            }} else
            {
                currentHealth -= demage;
            } 
       
        currentArmour = Mathf.Clamp(currentArmour, 0, maxArmour);
        currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
    }
    void Update()
    {
        
        if (canHeal > 0.0f)
        {
            canHeal -= Time.deltaTime;
        }
        if (canRegenerate > 0.0f)
        {
            canRegenerate -= Time.deltaTime;
        }

        if (Input.GetKeyDown(KeyCode.P)) {
            takeHit(30);
        }

        if (canHeal <= 0.0f && currentHealth < maxHealth)
        {
            regenerate(ref currentHealth, maxHealth);
        }


    }

void regenerate(ref float currentStat, float maxStat)
    {
        currentStat += maxStat * 0.005f;
        Mathf.Clamp(currentStat, 0, maxStat);
    }


}

 

komentarz 2 września 2019 przez piotrsz109 Stary wyjadacz (13,730 p.)
Upewnij się, że skrypt jest dołączony do tego samego GameObject'u co Collider
komentarz 2 września 2019 przez Bezy Bywalec (2,280 p.)

Czy to oznacza że do obiektu w którym jest Collider mam podpiąć skrypt Send Message, Jeśli tak to mi nie działa pomóż !!!!!!!!!! Jesteś moją jedyną nadzieją teraz, co oznacza że Send Message take Hit has no receiver

komentarz 2 września 2019 przez piotrsz109 Stary wyjadacz (13,730 p.)
Mam na myśli, że do GameObject, który ma Collider, skrypt PlayerStats powinien być przypisany. Ponadto możesz, jako argument, zdefiniować, czy powinno wymagać odbiorcy.

https://docs.unity3d.com/ScriptReference/GameObject.SendMessage.html
1
komentarz 2 września 2019 przez Bezy Bywalec (2,280 p.)

Dziękuję ci za twoją pomoc, normalnie nie wiem co bym bez ciebie zrobił Przyjacielu!smiley 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 328 wizyt
pytanie zadane 6 sierpnia 2019 w C# przez Bezy Bywalec (2,280 p.)
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 3 maja 2019 w C# przez edtjyuh Nowicjusz (220 p.)
0 głosów
1 odpowiedź 229 wizyt

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...