3D-wormcontroller-tutorial voor Unity

In deze tutorial laat ik zien hoe je een eenvoudige wormcontroller kunt maken in Unity, geïnspireerd door de TornadoTwins tutorial voor het ontwikkelen van games voor beginners serie.

De wormcontroller glijdt rond met een soepel staartvolgeffect en heeft de mogelijkheid om te springen.

De scripts in deze tutorial zijn oorspronkelijk geschreven in JavaScript (ook wel UnityScript genoemd) dat niet langer wordt ondersteund, dus ik zal een C# alternatief bieden.

Sharp Coder Video speler

Om een ​​wormcontroller te maken in Unity hebben we het volgende nodig:

  • Maak de benodigde scripts
  • Creëer een wormkarakter
  • Wijs de scripts toe aan het personage

Stap 1: Maak alle benodigde scripts

Laten we beginnen met het maken van alle scripts die nodig zijn om een ​​wormcontroller in te stellen:

  • Maak een nieuw script, noem het "SC_WormController" en plak de onderstaande code erin:

SC_WormController.cs

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

[RequireComponent(typeof(CharacterController))]
public class SC_WormController : MonoBehaviour
{
    public float speed = 3.0f;
    public float rotateSpeed = 1.0f;
    public float jumpSpeed = 5.0f;
    public float gravity = 9.8f;

    CharacterController controller;
    Vector3 moveDirection;

    // Start is called before the first frame update
    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        // Rotate around y - axis
        transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);

        // Move forward / backward
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        float curSpeed = speed * Input.GetAxis("Vertical");
        float movementDirectionY = moveDirection.y;
        moveDirection = forward * curSpeed;

        // Jumping
        if (Input.GetButtonDown("Jump") && controller.isGrounded)
        {
            moveDirection.y = jumpSpeed;
        }
        else
        {
            moveDirection.y = movementDirectionY;
        }

        // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
        // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
        // as an acceleration (ms^-2)
        if (!controller.isGrounded)
        {
            moveDirection.y -= gravity * Time.deltaTime;
        }

        // Move the controller
        controller.Move(moveDirection * Time.deltaTime);
    }
}
  • Maak een nieuw script, noem het "SC_CameraFollow" en plak de onderstaande code erin:

SC_CameraFollow.cs

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

public class SC_CameraFollow : MonoBehaviour
{
    /*
    This camera smoothers out rotation around the y-axis and height.
    Horizontal Distance to the target is always fixed.

    There are many different ways to smooth the rotation but doing it this way gives you a lot of control over how the camera behaves.

    For every of those smoothed values we calculate the wanted value and the current value.
    Then we smooth it using the Lerp function.
    Then we apply the smoothed values to the transform's position.
    */

    // The target we are following
    public Transform target;
    // The distance in the x-z plane to the target
    public float distance = 10.0f;
    // the height we want the camera to be above the target
    public float height = 5.0f;
    // How much we 
    public float heightDamping = 2.0f;
    public float rotationDamping = 3.0f;

    void LateUpdate()
    {
        // Early out if we don't have a target
        if (!target)
            return;

        // Calculate the current rotation angles
        float wantedRotationAngle = target.eulerAngles.y;
        float wantedHeight = target.position.y + height;
        float currentRotationAngle = transform.eulerAngles.y;
        float currentHeight = transform.position.y;

        // Damp the rotation around the y-axis
        currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);

        // Damp the height
        currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);

        // Convert the angle into a rotation
        Quaternion currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);

        // Set the position of the camera on the x-z plane to:
        // distance meters behind the target
        transform.position = target.position;
        transform.position -= currentRotation * Vector3.forward * distance;

        // Set the height of the camera
        transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z);

        // Always look at the target
        transform.LookAt(target);
    }
}
  • Maak een nieuw script, noem het "SC_SmoothFollow" en plak de onderstaande code erin:

SC_SmoothFollow.cs

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

public class SC_SmoothFollow : MonoBehaviour
{
    // The target we are following
    public Transform target;
    // The distance in the x-z plane to the target
    public float distance = 10.0f;
    // the height we want the camera to be above the target
    public float height = 5.0f;
    // How much we 
    public float heightDamping = 2.0f;
    public float rotationDamping = 3.0f;

    // Start is called before the first frame update
    void Start()
    {
        if (!target) return;

        transform.LookAt(target);
    }

    void LateUpdate()
    {
        // Early out if we don't have a target
        if (!target) return;

        // Calculate the current rotation angles
        float wantedRotationAngle = target.eulerAngles.y;
        float wantedHeight = target.position.y + height;

        float currentRotationAngle = transform.eulerAngles.y;
        float currentHeight = transform.position.y;

        // Damp the rotation around the y-axis
        currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);

        // Damp the height
        currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);

        // Convert the angle into a rotation
        var currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);

        // Set the position of the camera on the x-z plane to:
        // distance meters behind the target
        transform.position = target.position;
        transform.position -= currentRotation * Vector3.forward * distance;

        // Set the height of the camera
        transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z);

        // Always look at the target
        transform.LookAt(target);
    }
}

Stap 2: Creëer een wormkarakter

De volgende stap is het maken van een wormkarakter:

  • Maak een nieuwe Sphere (GameObject -> 3D Object -> Sphere), verander de positie in (0, 0, 0), verwijder de SphereCollider-component en hernoem deze naar "Worm"

  • Dupliceer de bol "Worm", hernoem deze naar "BodyPart1", verander de positie in (0, -0,1, -0,9) en verander de schaal in (0,8, 0,8, 0,8)
  • Dupliceer de bol "Worm" opnieuw, hernoem deze naar "BodyPart2", verander de positie in (0, -0,2, -1,6) en verander de schaal in (0,6, 0,6, 0,6)

  • Klik met de rechtermuisknop op het object "Worm" -> Maak leeg en hernoem het nieuw gemaakte object naar "Eyes"
  • Dupliceer de "BodyPart2" bol, hernoem deze naar "Eye" en verplaats deze binnen het "Eyes" object, verander de positie naar (-0,24, 0,353, 0,324) en verander de schaal naar (0,4, 0,4), 0,4)
  • Dupliceer de bol "Eye" en verander de X-positie in 0,24

  • Voor de visualisatie kun je een aantal materialen maken, bijvoorbeeld groen voor het lichaam en blauw voor de ogen.

Wormspel in eenheid

Het Worm-personage is klaar.

Stap 3: Stel de wormcontroller in

De laatste stap is het toewijzen van de scripts:

  • Voeg het SC_CameraFollow-script toe aan het Main Camera-object en wijs de "Worm" Sphere toe aan de doelvariabele:

  • Voeg het SC_WormController-script toe aan de "Worm"-bol (er wordt automatisch een andere component toegevoegd met de naam CharacterController):

  • Voeg het SC_SmoothFollow-script toe aan de "BodyPart1"-bol en stel de waarden ervan hetzelfde in als in de screenshot hieronder:

  • Voeg het SC_SmoothFollow-script toe aan de bol "BodyPart2" en stel de waarden ervan hetzelfde in als in de screenshot hieronder:

De controller is nu klaar, gebruik W, A, S en D om te bewegen en de spatiebalk om te springen.

Het bronpakket Unity is hieronder beschikbaar.

Voorgestelde artikelen
Helikoptercontroller voor Unity
Ondersteuning voor dubbele sprongen toegevoegd aan een 2D-platformgame-personagecontroller in Unity
Autocontroller voor Unity
Vliegtuigcontroller voor Unity
Speler 3D- en 2D-muursprong-tutorial voor Unity
Dialoogsysteem voor eenheid
Ondersteuning voor bewegende platforms toevoegen aan de karaktercontroller in Unity