Inhaltsverzeichnis

Unity is a game engine that can be written in C#.

Transform

transform.position

Mit „transform.position += …“ änderst du direkt die Position des Objekts im globalen (Welt-)Koordinatensystem. Es bewegt sich um den angegebenen Vektor im globalen Raum.

using UnityEngine;
 
public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5.0f;
 
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
 
        Vector3 movement = new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
        transform.position += movement;
    }
}

transform.Translate()

Mit „transform.Translate(movement, Space.World)“ verschiebst du das Objekt relativ zum globalen Koordinatensystem. Das bedeutet, dass die Verschiebung im globalen Raum stattfindet, unabhängig von der Ausrichtung des Objekts.

Mit „transform.Translate(movement, Space.Local)“ verschiebst du das Objekt relativ zu seinem eigenen lokalen Koordinatensystem. Die Verschiebung erfolgt entlang der lokalen Achsen des Objekts, unabhängig von seiner Ausrichtung im Weltraum.

using UnityEngine;
 
public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5.0f;
 
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
 
        Vector3 movement = new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
        transform.Translate(movement, Space.World);
    }
}

Bodies

In Unity, gibt es verschiedene Arten von Körpern (Bodies), die verwendet werden können, um die physikalischen Eigenschaften von Objekten in einer Spielwelt zu simulieren. Hier sind einige der wichtigsten Körperarten in Unity:

Rigidbody

Wenn ein GameObject eine Rigidbody Komponente hat, kannst du die physikalischen Kräfte nutzen, um es zu bewegen.

Physikalische Objekte sollten immer in FixedUpdate() verarbeitet werden!

Um ein GameObject mit einer Rigidbody-Komponente in Unity zu bewegen, gibt es mehrere Möglichkeiten.

AddForce

Du kannst die AddForce() Methode verwenden, um eine Kraft auf das Rigidbody anzuwenden. Dies eignet sich gut für die Simulation von physikalischen Bewegungen.

Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(Vector3.forward * forceAmount, ForceMode.Impulse);

velocity

Du kannst die velocity Eigenschaft direkt setzen, um die Geschwindigkeit des Rigidbody zu ändern. Dies überschreibt eventuelle bestehende Kräfte.

Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = new Vector3(x, y, z);

MovePosition

Mit der MovePosition() Methode kannst du den Rigidbody sofort an eine neue Position setzen. Dies kann nützlich sein, wenn du sicherstellen möchtest, dass das GameObject an einem bestimmten Punkt endet. Beachte, dass diese Methode keine Kollisionserkennung enthält und möglicherweise durch andere Objekte hindurchgehen kann.

Rigidbody rb = GetComponent<Rigidbody>();
rb.MovePosition(new Vector3(x, y, z));

CharacterController

Der CharacterController ist eine spezialisierte Komponente für die Bewegung von Charakteren in Spielen. Sie ermöglicht die einfache Steuerung von Charakteren, die sich in der Szene bewegen müssen.

Move

Die Move() Methode bewegt den Charakter relativ zu seiner aktuellen Position, wobei Kollisionen mit anderen Objekten automatisch behandelt werden.

using UnityEngine;

public class MoveController : MonoBehaviour
{
    public float moveSpeed = 3.0f;
    public float rotationSpeed = 120.0f;
    public float jumpForce = 5.0f;
    public float crouchHeight = 0.5f;
    public float standingHeight = 2.0f;

    private CharacterController characterController;
    private bool isCrouching = false;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        Vector3 moveDirection = transform.forward * vertical;
        float turnAmount = horizontal * rotationSpeed * Time.deltaTime;
        transform.Rotate(0, turnAmount, 0);

        // Jumping
        if (Input.GetButtonDown("Jump") && characterController.isGrounded)
        {
            moveDirection.y = jumpForce;
        }

        // Crouching
        if (Input.GetKeyDown(KeyCode.C))
        {
            if (isCrouching)
            {
                characterController.height = standingHeight;
                isCrouching = false;
            }
            else
            {
                characterController.height = crouchHeight;
                isCrouching = true;
            }
        }

        characterController.Move(moveDirection * moveSpeed * Time.deltaTime);
    }
}

SimpleMove

Du kannst auch die integrierte Schwerkraft und Geschwindigkeit des CharacterController verwenden, um ihn zu bewegen.

using UnityEngine;

public class SimpleMoveController : MonoBehaviour
{
    public float moveSpeed = 3.0f;
    public float jumpForce = 5.0f;
    public float crouchHeight = 0.5f;
    public float standingHeight = 2.0f;

    private CharacterController characterController;
    private bool isCrouching = false;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        Vector3 moveDirection = new Vector3(horizontal, 0, vertical);
        moveDirection = transform.TransformDirection(moveDirection);
        moveDirection *= moveSpeed;

        // Jumping
        if (Input.GetButtonDown("Jump") && characterController.isGrounded)
        {
            moveDirection.y = jumpForce;
        }

        // Crouching
        if (Input.GetKeyDown(KeyCode.C))
        {
            if (isCrouching)
            {
                characterController.height = standingHeight;
                isCrouching = false;
            }
            else
            {
                characterController.height = crouchHeight;
                isCrouching = true;
            }
        }

        characterController.SimpleMove(moveDirection);
    }
}

Springen

Um den CharacterController zum Springen zu bringen, kannst du die Move-Methode mit einer zusätzlichen y-Komponente verwenden.

if (characterController.isGrounded)
{
    velocity.y = jumpForce;
}

characterController.Move(velocity * Time.deltaTime);

FPS Controller

Bei einem FPS Controller werden Bewegungen und Drehungen meißt separat behandelt.

PlayerMovement

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerMovement : MonoBehaviour
{
    public float walkSpeed = 5.0f;
    public float runSpeed = 10.0f;
    public float crouchSpeed = 2.0f;
    public float jumpForce = 8.0f;
 
    private CharacterController controller;
    private bool isCrouching = false;
 
    void Start()
    {
        controller = GetComponent<CharacterController>();
    }
 
    void Update()
    {
        float moveSpeed = walkSpeed;
 
        if (Input.GetKey(KeyCode.LeftShift))
        {
            moveSpeed = runSpeed;
        }
 
        if (isCrouching)
        {
            moveSpeed = crouchSpeed;
        }
 
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
 
        Vector3 move = transform.right * horizontal + transform.forward * vertical;
        controller.Move(move * moveSpeed * Time.deltaTime);
 
        if (Input.GetButtonDown("Jump") && controller.isGrounded)
        {
            controller.Move(Vector3.up * jumpForce * Time.deltaTime);
        }
 
        if (Input.GetKeyDown(KeyCode.LeftControl))
        {
            ToggleCrouch();
        }
    }
 
    void ToggleCrouch()
    {
        if (isCrouching)
        {
            controller.height = 2.0f;
            isCrouching = false;
        }
        else
        {
            controller.height = 1.0f;
            isCrouching = true;
        }
    }
}

PlayerController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerController : MonoBehaviour
{
    public float mouseSensitivity = 100.0f;
    public Transform playerBody;
    private float xRotation = 0.0f;
 
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }
 
    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
 
        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90.0f, 90.0f);
 
        transform.localRotation = Quaternion.Euler(xRotation, 0.0f, 0.0f);
        playerBody.Rotate(Vector3.up * mouseX);
    }
}

160721_jens_fakesch_ma_1_.pdf

SceneAssetBundle https://stackoverflow.com/questions/54787943/how-to-load-a-scene-from-asset-bundle-in-unity-2018

Shader basdics

Shader Tutorial

Shader tutorial Advanced Playlist

CrossPlatformInputManager implementation