Premiär! Fyndchans i SweClockers Månadens Drop

Problem med kod för unity, försöker skapa en slinga C#

Permalänk

Problem med kod för unity, försöker skapa en slinga C#

Hej jag försöker att begränsa hur långt bak slingan kan sträckas, koden är från en tutorial men en exakt kopia verkar inte fungera. Om jag i unity startar spelet så fungerar allt toppen med så fort jag trycker på bollen som ska skujtas iväg får jag upp detta error:

NullReferenceException: Object reference not set to an instance of an object
BallScript.DragBall () (at Assets/BallScript.cs:37)

Vad jag vill är att kunna begränsa hur långt bak jag kan dra bollen innan den stoppas så att man inte kan skjuta den hur långt so helst. Om ni har andra övriga tips så skulle dom uppskattas. PS: Jag skickar med en bild från unity.

tackar i förväg.
här är hela koden:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallScript : MonoBehaviour { private bool isPressed; private float releaseDelay; private float maxDragDistance = 2f; private float distance; private Rigidbody2D rb; private SpringJoint2D sj; private Rigidbody2D slingRb; private void Awake(){ rb = GetComponent<Rigidbody2D>(); sj = GetComponent<SpringJoint2D>(); slingRb = sj.connectedBody; releaseDelay = 1/ (sj.frequency*4); } void Update() { if(isPressed){ DragBall(); } } void DragBall() { Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); distance = Vector2.Distance(mousePosition, slingRb.position); if(distance > maxDragDistance){ Vector2 direction = (mousePosition - slingRb.position).normalized; rb.position = slingRb.position + direction * maxDragDistance; }else { rb.position = mousePosition; } } void OnMouseDown() { isPressed = true; rb.isKinematic = true; } void OnMouseUp() { isPressed = false; rb.isKinematic = false; StartCoroutine(Release()); } private IEnumerator Release(){ yield return new WaitForSeconds(releaseDelay); sj.enabled = false; } }

bild:
Trasig länk till lokal fil raderad. // Mod

Permalänk
Medlem

Nu använder jag varken Unity eller C#, men baserat på felmeddelandet så lär ju slingRb vara null. Manualen för Unity säger att SpringJoint2D.connectedBody är null om leden inte är ansluten till en annan kropp utan till en fast punkt. Så jag antar att din boll inte är ihopkopplad med slungan via en led, men hur man gör det i Unity har jag ingen aning om.

Vi kommer för övrigt inte åt bilder som ligger på din dator, vill du visa bilder så måste du ladda upp dem på någon bildtjänst (t.ex. Forumbilder) och sen länka dit istället.

Permalänk
Medlem

Ett hett tips är att använda debuggern.
Felmeddelandet talar om för dig att du försöker anropa en metod / komma åt en property på ett objekt som är null.
Det talar även om för dig att felet uppstår på rad 37 i koden, vilket ger dig en utmärkt plats att sätta en brytpunkt på.

Kör sedan programmet i debuggläge (om jag inte missminner mig är snabbkommandot F5 i Visual Studio) så kommer programmet att stanna på den rad du satt din brytpunkt och då kan du enkelt se vilka värden dina variabler har.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem

Jag gissar på att perost svar är rätt. Kolla i Unity editorn att "Connected body" på spring joint komponenten inte är tomt.
https://docs.unity3d.com/Manual/class-SpringJoint.html