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

Prowizoryczny system strzelania w Unity

Object Storage Arubacloud
0 głosów
251 wizyt
pytanie zadane 14 czerwca 2020 w C i C++ przez Szyszka Gaduła (3,490 p.)

Witam. Problem polega na tym, że sphere podąża za graczem, jeśli usunę linijke z funkcją Move. Gdy jednak Move zostawie - sphere tworzy się na kordynantach 0, 0, 1 i przemieszcza się po osi Z. Pragnę osiągnąć taki efekt, aby sphere tworzył się w pozycji gracza, i wtedy przemieszczał się w osi Z. Dziękuje za wszystkie rady z góry. Oto kod obecny kod:

using UnityEngine;

public class ShootingSystem : MonoBehaviour
{
    PlayerController player = new PlayerController();
    GameObject sphere;
    public CharacterController projectileController;

    void Start()
    {
        sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.AddComponent<CharacterController>();
        projectileController =  sphere.GetComponent<CharacterController>();
    }

    void Update()
    {
        Shot();
    }
    private void Shot()
    {
        Vector3 playerPos = new Vector3(transform.localPosition.x, transform.localPosition.y+1, transform.localPosition.z+1);
        Vector3 projectileStartPos = new Vector3(0, 0, 1);
        sphere.transform.localPosition = playerPos;
        projectileController.Move(projectileStartPos * Time.deltaTime);
    }
}

 

1 odpowiedź

0 głosów
odpowiedź 14 czerwca 2020 przez _zixoziz Użytkownik (500 p.)
wybrane 15 czerwca 2020 przez Szyszka
 
Najlepsza

Cześć niestety nie bardzo umiem sprawdzać czyjeś kody i trudno mi jest znaleźć błąd, w Twoim. Ale mam swój skrypt obsługujący strzelanie. Do zmiennej "bullet" przypisz Twój pocisk, czy sphere (zawierającą component Rigidbody). 

 

Mam nadzieję, że pomogłem :)

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

public class Shooter : MonoBehaviour
{

    public Rigidbody bullet;
    public float power = 1500f;
    public float moveSpeed = 2f;

    void Update()
    {
        float h = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
        float v = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;

        transform.Translate(h, v, 0);

        if (Input.GetButtonUp("Fire1"))
        {
            Rigidbody instance = Instantiate(bullet, transform.position, transform.rotation) as Rigidbody;
            Vector3 fwd = transform.TransformDirection(Vector3.forward);
            instance.AddForce(fwd * power);
        }
    }
}

 

komentarz 15 czerwca 2020 przez Szyszka Gaduła (3,490 p.)
Trochę nie rozumiem tego kodu, mógł byś go wyjaśnić? Szczególnie chodzi mi o instance, fwd, oraz addforce. Wiesz też może, jak sprawić by nie tworzyły się klony sphere, tylko nowe? Potrzebuję tego dokonać, aby dało się usunąć po czasie te sphere.
komentarz 15 czerwca 2020 przez _zixoziz Użytkownik (500 p.)
Jasne.

fwd to u mnie zmienna, typu Vector3 odpowiadająca za kierunek w, którym ma lecieć nasz pocisk. Natomiast instance to także nazwa zmiennej typu Rigidbody i jest odpowiedzialna za utworzenie kopii prefabu pocisku. Jeżeli nie chcesz, aby przy Twoim pocisku wyświetlała się, że jest to clon, to w kodzie dopisz: instance.name = "NazwaPrefabaTwojegoPocisku";

Za pomocą powyższego wiersza zmienisz nazwę nowo utworzonego pocisku i później będziesz mógł dopisać o tym, żeby sam się usuwał po jakimś czasie (możesz też użyć nazwy zmiennej). A wiersz z instrukcją AddForce to nadanie siły naszemu nowo utworzonemu pociskowi.
komentarz 15 czerwca 2020 przez Szyszka Gaduła (3,490 p.)
edycja 15 czerwca 2020 przez Szyszka

Jeśli zmienię nazwę, to jak mam usunąć obiekt poprzez nazwę? Próbowałem też Destroy(instance, 3); w ifie, ale po 3 sekundach ten klon się po prostu zatrzymywał :/ Jak usuwać klon? Ok, udało się. To teraz chyba ostatnie pytanie :v. Dlaczego to dosłownie zawiesza mi całe Unity? Co robię nie tak? 

        if (Input.GetButtonDown("Fire1"))
        {
            playerPos = new Vector3(transform.position.x, transform.position.y + 1, transform.position.z + 1);
            Rigidbody instance = Instantiate(bullet, playerPos, transform.rotation);
            instance.name = "Sphere(Clone)";
            Vector3 fwd = transform.TransformDirection(Vector3.forward);
            instance.AddForce(fwd * power);
            while (GameObject.Find("Sphere(Clone)"))
            {
                Destroy(GameObject.Find("Sphere(Clone)"), 3);
            }
        }

 

komentarz 15 czerwca 2020 przez _zixoziz Użytkownik (500 p.)

Pamiętaj, że zmienne bullet i power i moveSpeed. Ja akurat usuwam moj pocisk po 3 sekundach. Ale zrobiłem do tego nowy skrypt. Bo ten, który ci wcześniej dałem musisz przypisać do twoje postaci. Możliwym błędem jest to, że zniszczenie obiektu dałeś do funkcji Update. Daje ci mój skrypt na usunięcie. Skrypt musisz przypisać do prefabu Twojego pocisku. Do zmiennej removeTime, możesz przypisać dowolną wartość i po tym czasie obiekt będzie się niszczył. Teraz liczę na naj :).


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class bulletDestory : MonoBehaviour
{
 
   public float removeTime = 3.0f;

   void Start()
   {
          Destroy(gameObject, removeTime);
   }
 
    void Update()
    {
   
    }
}

 

komentarz 15 czerwca 2020 przez Szyszka Gaduła (3,490 p.)
edycja 15 czerwca 2020 przez Szyszka

Dałem naj, jak najbardziej się należy :D. Teraz pytanie, ponieważ gdy wystrzele np. 2 pociski na raz, to jeden usuwa się po 3s a drugi po 6s. Da się temu zapobiec?

Edit:

Udało mi się, można zakończyć ten temat. Może pozostawię gotowca dla innych przyszłych twórców :D. Dzięki raz jeszcze!

using UnityEngine;
public class ShootingSystem : MonoBehaviour
{
    GameObject sphere;
    Vector3 playerPos;
    public Rigidbody bullet;
    public float power = 1500f;
    public float moveSpeed = 2f;
    private float mousePress = 0;
    private void Start()
    {
        sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.AddComponent<Rigidbody>();
        bullet = sphere.GetComponent<Rigidbody>();
    }

    void Update()
    {
        float h = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
        float v = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;

        transform.Translate(h, v, 0);
        if (Input.GetButtonDown("Fire1"))
        {
            mousePress++;
            playerPos = new Vector3(transform.position.x, transform.position.y + 1, transform.position.z + 1);
            Rigidbody instance = Instantiate(bullet, playerPos, transform.rotation);
            for (int i = 0; i <= mousePress; i++)
            {
                instance.name = "Sphere(Clone)" + i;
                if (GameObject.Find("Sphere(Clone)"+i).GetComponent<destroyProjectile>() == false)
                    GameObject.Find("Sphere(Clone)" + i).AddComponent<destroyProjectile>();
            }
            Vector3 fwd = transform.TransformDirection(Vector3.forward);
            instance.AddForce(fwd * power);
        }
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 18 czerwca 2020 w C# przez ZIXOZIZ Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 96 wizyt
pytanie zadane 13 grudnia 2023 w Systemy operacyjne, programy przez M4jk3l07 Początkujący (290 p.)
0 głosów
0 odpowiedzi 141 wizyt
pytanie zadane 5 sierpnia 2021 w C# przez Kamil Lewczuk Nowicjusz (170 p.)

92,630 zapytań

141,491 odpowiedzi

319,862 komentarzy

62,011 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...