Jump to content
Unity Insider Forum

Problem C# - void "Wird nicht verwendet"


superkerni

Recommended Posts

Hallo,

ich arbeite beim Skripting mit Visual Studio 2019. Was mache ich beim Scripting falsch, wenn die void-Namen blass Ocker sind und nicht mehr kräftig gelb. Beim Cursor-over kommt die Meldung "Der private Member  '..die void Methode ... ' wird nicht verwendet". Das betrifft alle void`s. in der Klasse.

Danke Wolfgang

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier ein Ausschnitt:

Start und Update werden nicht verwendet ?

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

public class ProjectileMoveScript : MonoBehaviour 
{
    public bool rotate = false;
    public float rotateAmount = 45;
    public bool bounce = false;
    public float bounceForce = 10;
    public float speed;
	[Tooltip("From 0% to 100%")]
	public float accuracy;
	public float fireRate;
    public Transform spawnPoint;
	public GameObject muzzlePrefab;
	public GameObject hitPrefab;
	public List<GameObject> trails;

    private Vector3 startPos;
	private float speedRandomness;
	private Vector3 offset;
	private bool collided;
	public Rigidbody2D rb;
    private RotateToMouseScript rotateToMouse;
    private GameObject target;
    //public LevelManager levelOrganisator;
	public GameObject vfxPrefab;
	private int leben;

   void Start () 
   {
        startPos = transform.position;
        rb = GetComponent <Rigidbody2D> ();
 	
			  // Muzzle ---- Mündungsfeuer mit 
		if (muzzlePrefab != null) 
        {
			var muzzleVFX = Instantiate (muzzlePrefab, transform.position, Quaternion.identity);
			muzzleVFX.transform.forward = gameObject.transform.forward + offset;
			var ps = muzzleVFX.GetComponent<ParticleSystem>();
            if (ps != null)
            {
                Destroy(muzzleVFX, ps.main.duration);
            }
            else
            {
                var psChild = muzzleVFX.transform.GetChild(0).GetComponent<ParticleSystem>();
                Destroy(muzzleVFX, psChild.main.duration);
            }
		}
	}
	void Update () 
    {
         GameObject vfxBullet = (GameObject) Instantiate(vfxPrefab, spawnPoint.position, Quaternion.identity);

        if (speed != 0 )
        {
            //  Debug.Log("Fix: ");

            vfxBullet.GetComponent<Rigidbody2D>().AddForce(Vector3.left * speed);
        }

     }
......

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Sascha:

Dann stimmt was mit deinem Unity-Plugin in Visual Studio nicht. Ich empfehle Deinstallation und Neuinstallation von VS über Unity Hub.

Hat leider auch nichts geholfen. Habe  "Start" und "Update" zu public gemacht. Dann war alles OK !

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Das hat mit der Code Optimierung zu tun. Wenn du eine Variable deklarierst z.b. „  int  wert =10; “ wird automatisch der (Zugriffsmodifizierer) private angenommen und ist somit nur in der eigenen Klasse ansprechbar. Wird nun in der eigenen Klasse nicht auf die Variable( wert) zugegriffen z.b. „ wert =10; „ wird davon ausgegangen, dass die Variable nicht benutzt und somit unnötiger Speicherplatz verbraucht wird, und somit erhältst du einen Hinweis das keine Verwendung stattfindet, das gilt auch für Methoden wenn kein Aufruf in der eigenen Klasse erfolgt. Verwendest du aber den (Zugriffsmodifizierer) public erhältst du diesen Hinweis nicht, da der Zugriff auch von einer anderen Klasse möglich wäre.

Da public im Inspector angezeigt wird, kannst du auch z.b. internal verwenden. internal wird nicht im Inspector angezeigt und gilt Innerhalb des Aktuellen Projekts

Ups wie immer zu Spät...

 

Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man muss halt dazu sagen, dass Unity viel mit Reflection... äh... Magie macht. Zum Beispiel private Methoden aufrufen oder Werte in private Felder schreiben. Und damit kommen IDEs und der Compiler nicht von Haus aus klar, weil sie da nicht nachvollziehen können. Das ist wie der TÜV, der dein Auto nicht zulässt, weil die Tür nicht aufgeht... aber du steigst immer durch die Kofferraumklappe ein, kein Problem!

Das Unity-Plugin, das Unity mit VS mitinstallieren sollte, hilft VS beim "Verständnis" und sorgt dafür, dass VS nichts mehr sagt, wenn es so etwas (bei MonoBehaviour-Events wie Start und Update!) sieht. Vermutlich über Bestechung oder so.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, habe ich wieder private gestellt. Die Routinen werden trotzdem durchlaufen. Bestechen ist bei mir nicht, trinke meinen Grappa selbt und Bill trinkt Bourbon !

 

Zu Jog: Bei den Variablen ist das klar, aber bei den void`s , ogbwohl z.B. Update durchlaufen wird ???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Programm liegt ja auch im Speicher. Ist aber echt nicht viel. Du kriegst ja auch keine Fehlermeldung, sondern eine Warnung. Die besagen immer, dass etwas zwar kompilieren und laufen wird, aber vermutlich nicht so funktionieren wird, wie du es vorhattest. Wenn du z.B. eine Variable oder eine Methode nirgendwo nutzt, dann gibt es eben eine Warnung, weil man davon ausgeht, dass du keinen Code schreibst, um ihn dann nicht zu benutzen. Es wird stattdessen davon ausgegangen, dass du es einfach nur vergessen hast, die Methode an der richtigen Stelle auch aufzurufen. Das ist der Charakter bei allen Warnungen, weswegen man sie niemals ignorieren sollte. Umso schlechter ist es, wenn etwas nicht schief geht und du eine False-positive-Warnung kriegst - wie hier.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo, @superkerni

vor einer Stunde schrieb superkerni:

Zu Jog: Bei den Variablen ist das klar, aber bei den void`s , ogbwohl z.B. Update durchlaufen wird ???

Bin auch nur Hobby Programmierer und kenne mich auch nicht so gut mit allem aus, ich glaube zu wissen dass,

Die Update Methode z.b. gehört zu den von MonoBehaviour bereitgestellten Methoden, die durch bestimmte Ereignisse ausgelöst oder in regelmäßigen Abständen von Unity aufgerufen werden.

Hierbei durchläuft Unity alle GameObjects und deren Skript-Instanzen und führt dort die entsprechenden Methoden aus. Um diese void`s kümmert sich also Unity selbst.

Bei selbst geschriebenen void`s muss man sich selbst darum kümmern.

Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke Leute,

im wesentlichen ist das alles schon klar. In meiem vergangenen Berufsleben war ich u.a. 35 Jahre auch Programmierer (Pascal, Access und .NET). Mit C# habe ich erst jetzt angefangen. Spiele unterscheiden sich doch sehr von einem Warenwirtschaftssystem. Es ist sehr spannend das Parallelverhalten von verschiedenen Charakteren und deren Reaktionen programmtechnisch im Griff zu behalten. Somit für mich noch ein Neuland !!

Gruß Wolfgang

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb gombolo:

Naja, alle Programme....ob Spiele oder Warenwirtschaftssysteme machen nichts anderes als Daten zu verwalten. Das Eine stellt das Ergebnis als Zahlen dar und das Andere als bunte, leuchtende Objekte :D

 

Sorry, so allgemein gesehen ist das natürlich  richtig. Parallele Prozesse im Warenwirtschaftssystem unterscheiden sich aber gewaltig von denen in Spielen !

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

Ich habe die letzte Datensicherung zurückgespielt und siehe da, alles wieder in Ordnung !! Wer weiß womit ich mein Projekt geschädigt habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...