Wie programmiert man einen virtuellen 3D-Raum ohne Game Engine?

Heutzutage haben kleinere Entwickler den Vorteil, dass es Game Engines gibt, die einen den großteil der eigentlichen Arbeit abnehmen und bereits beim starten eines neuen Projektes einen leeren und fertigen 3D Raum anzeigen, wo Sie nur noch ihre mit Blender z.b. modelierten Objekte reinplatzieren müssen und simple Script Dateien programmieren müssen um die reinplatzierten Objekte aufgaben zu geben. Wie das bewegen auf Koordinaten sobald der Spieler W,A,S,D benutzt. Dann braucht man das "Spiel" nur noch exportieren und man hat eine ausführbare .exe datei die einen 3D Raum beinhaltet mit einem objekt das man steuern kann.

Aber das was mich interessiert ist, wie genau macht man den eigentlich den leeren Raum den es bereits schon immer als Vorlage gibt bei Game Engiens wie Unity oder Unreal ENgine? Allein Blender um überhaupt die 3D Modelle zu machen ist ja schon selber ein vorgefertigter 3D Raum der als Werkzeug dient um Objekte zu modellieren!

Also wie programmiert man eigentlich überhaupt denn 3D Raum den man überhaupt zuerst braucht um darauf dann ein spiel bauen zu können?

Um das ganze zu verbildlichen:

Das hier ist ein 3D Raum worin man sich frei umschauen kann und das jeder hat der ein neuen und Leeren Projekt startet in einer Engine wie Unity:

Aber wie macht man denn überhaupt den vorgefertigten 3D Raum / die eigentliche Scenen-Ansicht die man im Editor bereits von Unity hat?

Benutzt man dafür ein Visual Studio-Forms Projekt um überhaupt einen 3D Raum aus dem Nichts zu erschaffen oder wie macht man den eigentlichen leeren 3D Raum überhaupt indem dann später erst alles stattfinden kann?

Bild zum Beitrag
Computer, Technik, Programmierer, programmieren, Programmiersprache, Technologie, Unity 3D, Visual Studio, Unity, Unreal Engine, Unity Engine, Unreal Engine 4, Spiele und Gaming
C# / Unity: Mit Leertaste Spiel starten?

Hallo,

ich habe ein Spiel in Unity programmiert, in dem man mit einem Block verschiedenen Blöcken ausweichen muss. Wenn man diese berührt, fängt alles noch einmal an (ziemlich einfaches Spielprinzip).

Der Spielerblock bewegt sich dauerhaft nach vorne und man hat die Möglichkeit, sich nach rechts oder links zu bewegen.

Nun möchte ich, wenn ich am Anfang des Spiels die Leertaste drücke, dass sich dieser Block ab dann dauerhaft nach vorne bewegt. Nur leider geht der Spieler immer nur ein paar Pixel nach vorne, wenn ich die Leertaste drücke. Aber er soll dauerhaft nach vorne gehen. Ich hoffe, Ihr versteht, was ich meine.

Hier mein Quellcode:

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

public class MoveScript : MonoBehaviour
{
  public float movespeed = 7f;
  public float movespeed2 = 7f;

  // Start is called before the first frame update
  void Start()
  {
  }

  // Update is called once per frame
  void Update()
  {
    float H = Input.GetAxis("Horizontal") * movespeed;
    Vector3 vec = new Vector3(H, 0, 0);
    Vector3 frontvec = new Vector3(0, 0, movespeed2);

Ab hier versuche ich, dies zu programmieren:

if (Input.GetKeyDown(KeyCode.Space))
{
  transform.Translate(frontvec * movespeed2 * Time.deltaTime);
}

if (Input.GetKeyUp(KeyCode.Space))
{
  transform.Translate(frontvec * movespeed2 * Time.deltaTime);
}

Ab hier geht es mit dem Rest weiter:

    transform.Translate(vec * movespeed * Time.deltaTime);
  }
  
  private void OnCollisionEnter(Collision collision)
  {
    if (collision.gameObject.tag == "Starters")
    {
      SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
  }
  
  private void OnTriggerEnter(Collider other)
  {
    if (other.gameObject.tag == "SpeedP")
    {
      movespeed2 += 1f;
    }
  
    if (other.gameObject.tag == "SideSPWN")
    {
      SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
  }
}
C Sharp, Unity
Unity: Sprung verbessern?

https://www.youtube.com/watch?v=fSA0z6qmyR8

Ich hätte eine Frage: Wie mache ich es, dass ich in meinem Unity-Projekt (2D RPG) die Sprungfunktion flüssiger mache. Also, sodass ich bestimmen kann, dass sich der Charakter schneller nach oben und unten bewegt.

Ich habe außerdem das Problem, dass, wenn ich nach rechts oder links springe, aber an einem Collider komme, der Charakter an dem Collider hängen bleibt. Wie behebe ich das, dass eben der Charakter dann nur am Collider ankommt, aber dann direkt nach unten fällt und nicht solange hängen bleibt, bis ich aufhöre, gegen den Collider zu gehen?

Code des PlayerController:

public class PlayerController : MonoBehaviour
{
  public float moveSpeed;
  private Animator anim;
  private Rigidbody2D playerRigidbody;
  private bool playerMoving;
  private bool playerJumping;
  
  [SerializeField]
  private float jumpVelocity;

  [SerializeField]
  private LayerMask platformsLayerMask;

  private Rigidbody2D rigidbody2d;
  private BoxCollider2D boxCollider2d;

  // Start is called before the first frame update
  void Start()
  {
    anim = GetComponent<Animator>();
    playerRigidbody = GetComponent<Rigidbody2D>();
    boxCollider2d = transform.GetComponent<BoxCollider2D>();
  }

  // Update is called once per frame
  void Update()
  {
    playerMoving = false;
    playerJumping = false;

    if (Input.GetAxisRaw("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f)
    {
      playerRigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed, playerRigidbody.velocity.y);
      playerMoving = true;
    }

    if (Input.GetAxisRaw("Horizontal") < 0.5f && Input.GetAxisRaw("Horizontal") > -0.5f)
    {
      playerRigidbody.velocity = new Vector2(0f, playerRigidbody.velocity.y);
    }

    anim.SetFloat("MoveX", Input.GetAxisRaw("Horizontal"));
    anim.SetBool("PlayerMoving", playerMoving);
    anim.SetBool("PlayerJumping", playerJumping);

    if (IsGrounded() && Input.GetKeyDown(KeyCode.Space))
    {
      // jumpVelocity = 8.8f;
      playerRigidbody.velocity = Vector2.up * jumpVelocity;
    }
  }

  private bool IsGrounded()
  {
    float extraheight = .5f;
    RaycastHit2D raycastHit = Physics2D.BoxCast(boxCollider2d.bounds.center, boxCollider2d.bounds.size, 0f, Vector2.down, extraheight, platformsLayerMask);
    Color rayColor;

    if (raycastHit.collider != null)
    {
      rayColor = Color.green;
    }
    else
    {
      rayColor = Color.red;
    }

    //Debug.DrawRay(boxCollider2d.bounds.center, Vector2.down * (boxCollider2d.bounds.extents.y + extraheight), rayColor);
    //Debug.Log(raycastHit.collider);

    return raycastHit.collider != null;
  }
}
programmieren, Unity

Meistgelesene Beiträge zum Thema Unity