Jump to content
Unity Insider Forum

2D Shooting - Projektil an Slot/Gun binden ?


superkerni

Recommended Posts

Hallo,

schießen kann mein Player schon, aber zur Zeit nur in Richtung der x-Achse. Mein Player (SPINE Character) ist aber im  Körper, Kopf und Armen (mit Gun) beweglich und richtet sich beim Schießen nach dem MouseCursor.

Leider Macht das mein Projektil nicht. Muss ich das Spawn-Objekt oder nur das Projektil-Prefab an die Waffe binden ? Wenn ja wo muss ich lesen ? Regelt man das mit "Attachments" , oder geht das ganz anders ?

Danke

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke Jog,

der empfohlenen Beitrag stärkt erst einmal das Wissen zum Vectorverhalten.

Habe in der Zwischenzeit eine andere Lösung gefunden. Bei SPINE-Characters gibt es eine Funktion:   "BoneFollower" ! Siehe Anhang. Man kann den bone direkt ansprechen !

Eine Skriptlösung scheint mir aber universeller !

BulletSpawn.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Im prinzip brauchst du ja nur bein instanzieren die Position und Rotation von deinem Bone "Gun"?  Wieso das du den BoneFollower verwenden willst verstehe ich nicht ganz.

Ich mache mir hier zusätzlich in Spine noch einen Bone "firePoint" der an der Position ist wo mein Projektil gespawnt werden soll.

Am 25.12.2020 um 16:06 schrieb superkerni:

Eine Skriptlösung scheint mir aber universeller

BoneFollower ist ja eigentlich schon ein Script. Du wirst ja aber ein eigenes haben, wo du schiesst. Aber den Bone kannst du dort genau so einbinden wie es der BoneFollower macht. Dazu brauchst du einfach eine Referenz zu deiner SpineAnimation und holst dir dann den entsprechenden Bone.

using UnityEngine;
using Spine.Unity;
//using System.Diagnostics;

public class WeaponBullets : MonoBehaviour
{

    public Spine.Bone BfirePoint;
    public SkeletonAnimation skeletonAnim;

    private void Start()
    {

        BfirePoint = skeletonAnim.skeleton.FindBone("firePoint");
       
    }

    void spawnBullets()
    {

        if (cController.m_FacingRight)
        {
            firePointPos = new Vector3(this.transform.position.x + BfirePoint.WorldX, this.transform.position.y + BfirePoint.WorldY, 0);
			firePointRot = BfirePoint.WorldRotationX;
        }
        else
        {
            firePointPos = new Vector3(this.transform.position.x - BfirePoint.WorldX, this.transform.position.y + BfirePoint.WorldY, 0);
			firePointRot = BfirePoint.WorldRotationX * -1;
        }

			GameObject bullet = Instantiate(bulletPrefab, firePointPos, firePointRot);
	}
}

So in etwa mach ich das z.B. Wichtig ist das du using Spine.Unity; verwendest

 

----------------------------------------------------------------------------------

 

Alternativ kannst du die Bones auch alle spawnen und dir den Bone Gun einfach als Referenzposition dann normal über dessen Transform verwenden.

 

Unbenannt-2.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank Jomnitech,

einen Spawn-Point (Firepoint) habe ich ja, ich bin (war ?) nur zu doof diesem eine Richtung zu geben. Als totaler Anfänger verwende ich die vorhandenen Beispiele von Esoteric (Spine Examples) und baue diese für meine Ansprüche um. Da ist die Shoot-Richtung schon programmiert , aber ohne Bullet, nur mit Particle (Mündungsfeuer).

Dein Vorschlag ist eigentlich recht einfach und klar. "BoneFollower" kann es ja kaum anders machen. Wieder ein Wissensbaustein, danke.

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab mir das mal angeschaut. Im Prinzip kannst du ja das einfach erweitern. Der Spineboy hat einChild "VIEW Spineboy", dort ist ein Skript names SpineboyBeginnerView drauf. Das Script kannst du ja einfach erweitern, indem du einmal dein Bullet Prefab als Referenz deklarierst:
 

[Header("Effects")]
public ParticleSystem gunParticles;
[Header("Bullet")]
public GameObject bulletPrefab;  //<<------------------
#endregion

und es und es dann beim void PlayShoot instanzierst.

gunSource.pitch = GetRandomPitch(gunsoundPitchOffset);
gunSource.Play();
//gunParticles.randomSeed = (uint)Random.Range(0, 100);
gunParticles.Play();
GameObject go = Instantiate(bulletPrefab, gunParticles.transform.position, gunParticles.transform.rotation);  //<<------------------

Damit es richtig klappt, musst du noch beim Child "PARTICLE Gun" beim BoneFollower das Häkchen bei Follow Bone Rotation setzen.

--------------------------------------------------------------------------------

Als Bullet verwende ich ein Sprite mit einem Capsule Collider 2d und einem Rigidbody 2d, dazu noch ein kleines Skript welches das ganze steuert.
 

public class Bullet : MonoBehaviour
{

    public float speed = 20f;
    public float lifetime = 1.5f;
    public int damage = 10;
    private Rigidbody2D rb;
    
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();

        rb.velocity = transform.right * speed;

        Destroy(gameObject, lifetime);
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        //Destroy(gameObject);
    }

}

Das ganze kannst du dann als Prefab speichern und als referenz in das SpineboyBeginnerView Skript reinziehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Super, genau dieses Spine-Skript (SpineboyBeginnerView) verwende ich !!  Das hast Du aber fix zusammen gebastelt.

War mir eigentlich klar, daß man das  im PlayShoot irgendwie integrieren kann. Zur Zeit werde ich diese Lösung erst mal nicht verbessern, da ich für meinen Enkel unbedingt noch das kleine Jump&Run fertig stellen muss. Die Aufgabe soll sein, Highscore ständig zu verbessern. Eine Szene, in der nach gewisser Zeit Monster und Money wieder zum Leben erweckt werden. Der Weihnachtsmann schmeißt Geschenk-Würfel von der Wolke, die den Player behindern.  (Ich habe erst vor zwei Monaten angefangen mich mit Unity sporastisch zu beschäftigen).

Nur eine kleine Sache, aber ich übe, nichts ist perfekt  und ich hoffe, mein Enkel hat Spaß !!! 😊

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...