Jump to content
Unity Insider Forum

der FPS Controller aus den Standard Assets - Fragen!


Sugarbaby

Recommended Posts

Hallo,

anscheinend funktioniert der FPS controller nur im PC/Mac/LinuxStandalone Plattform. Switche ich auf Android, funktioniert er nicht mehr auf der PC-Tastatur. Vielleicht ist das ja der Grund dafür, dass ich die Anwendung am Handy nicht zum "laufen" bekomme...?!

Bitte, ist das so? Und falls Ja, gibt es einen Workaround?

SB

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist vielleicht nicht das, was du hören willst, aber: Selber einen schreiben. Einen simplen FPS controller, der nicht durch Wände läuft und sich umgucken kann, ist gar nicht mal so ein dickes Ding. Der Standard-FPS-Controller hat einige Features drin, die eine kleine XR-Präsentation nicht einmal ansatzweise braucht - lass dich also con dessen Umfang nicht abschrecken.

Generell sind diese ganzen Standard Assets eher nur für Prototyping geeignet. Sobald du damit wirklich ein Produkt erstellen willst, fängt's an, überall zu haken, weil du eben bei jedem Projekt etwas andere Ansprüche hast, und diese eben nicht alle vorausschauend erfüllt werden können. Versuche also nicht, Standard Assets umzubiegen - schreib dir etwas eigenes. Und ja, im Zweifelsfall heißt das Programmieren lernen.

Du du rumspringen möchtest, bietet sich ein CharacterController mehr an als eine NavMesh-Lösung, also bleiben wir dabei. Du nimmst erstmal ein leeres GameObject und packst einen CharacterController drauf. Dann machst du ein neues C#-Script und packst es auch drauf. Dieses Script wird den CharacterController steuern, indem es den Move-Befehl ausführt. Dafür besorgt es sich in Awake erst einmal eine Referenz auf den CharacterController und speichert sie:

private CharacterController controller;

private void Awake()
{
  controller = GetComponent<CharacterController>();
}

Danach kannst du im Code an jeder Stelle mit dem Namen "controller" auf den CharacterController zugreifen, der auf demselben GameObject liegt wie das Script. Wir fügen noch einen Bewegungsvektor zum Script hinzu, den wir mit Input und Gravitation beeinflussen, und den füttern wir in die Move-Funktion, damit sich der Controller bewegt. Das Gerüst, um den Bewegungsvektor zu setzen, schreibe ich einfach mal hin. Ich hoffe, der ist weitestgehend selbsterklärend.

private Vector3 movement;
public float speed = 10;
public float gravity = 10;
public float jumpPower = 10;

private void Update()
{
  if (controller.isGrounded)
  {
    // controller berührt den Boden
    var input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
    input = Vector3.ClampMagnitude(input, 1);
    movement = transform.TransformDirection(input) * speed;
    
    if (Input.GetButtonDown("Jump"))
    {
      movement.y = jumpPower;
    }
    else
    {
      movement.y = -1;
    }
  }
  else
  {
    // controller ist in der Luft
    movement.y -= gravity * Time.deltaTime;
  }
  
  controller.Move(movement * Time.deltaTime);
}

Eigentlich will man nicht Update, sondern FixedUpdate benutzen, damit das Gameplay deterministisch ist... aber damit macht man wieder ein neues Fass auf.

Diese Menge an Code reicht jedenfalls schon, um mit einem CharacterController durch die Gegend zu laufen und zu springen. Wenn du jetzt noch etwas Code hinzufügst, um das Objekt um die Y-Achse zu drehen, kannst du dich auch umschauen. Die Zeile mit "TransformDirection" sorgt dafür, dass man bei gedrehter Figur weiterhin nach vorne läuft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Hi,

habe gerade erst deine Anmerkungen gesehen - sry! Und Danke.

Das programmieren kann ich momentan einfach nicht erlernen. Es gibt keine Aussicht, dass ich das Programmieren sinnvoll einsetzen könnte in Zukunft. Im Grunde bin ich mit den Bordmitteln schon so weit, wie ich Unity einsetzen will - ohne programmieren zu müssen. Was mir halt fehlt ist eine Kamera, die am Handy steuerbar ist. Und die habe ich ja auch schon fast mit dem FPS Controller. "Fast", weil die Vorwärtsbewegung mittels Joystick sich ändert, wenn man sich mit dem Cardboard auf der Nase mal um 180° dreht und nach hinten schaut.

Und Du sprichts da am Schluß genau den Punkt an, der mir noch diese Schwierigkeiten macht - Die TransformDirection. Aber ich kann im FPS ControllerScript nicht erkennen, wo ich die Zeile einsetzen sollte. Liegt´ in der Natur der Sache - sprichst du eine Sprache nicht, kannst du das eine Wort das du hast auch nicht sinnvoll in einen Text einsetzen.

Hmmm´....schade...

SB

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok - ich habe mir mal ein paar Tutorials angeschaut, um mich wohl doch C# "anzunähern" - eigentlich ganz interessant, wie ich finde...Mal sehen, ob ich da an der Stange bleiben kann...

Vielleicht kann mir trotzdem noch Jemand mal einen bissl´ kräftigeren Kick geben - und zwar mit dem modifizeren des Scripts zur Kamerasteuerung, die ich momentan einsetze. Und da genau das implementieren von TransformDirection:

movement = transform.TransformDirection(input) * speed;

 

Wo, bitte, müßte die obige Zeile denn in diesen unteren Code eingefügt/getauscht werden?

 

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

namespace EasySurvivalScripts
{
    public enum CameraPerspective
    {
        FirstPerson,
        ThirdPerson
    }

    public class PlayerCamera : MonoBehaviour
    {

        [Header("Input Settings")]
        public string MouseXInput;
        public string MouseYInput;
        public string SwitchPerspectiveInput;

        [Header("Common Camera Settings")]
        public float mouseSensitivity;
        public CameraPerspective cameraPerspective;

        [Header("Character Animator")]
        public Animator CharacterAnimator;

        [Header("FPS Camera Settings")]
        public Vector3 FPS_CameraOffset;
        public Vector2 FPS_MinMaxAngles;

        [Header("TPS Camera Settings")]
        public Vector3 TPS_CameraOffset;
        public Vector2 TPS_MinMaxAngles;

        Transform FPSController;
        float xClamp;
        Vector3 camMoveLoc;
        Transform _fpsCameraHelper;
        Transform _tpsCameraHelper;

        private void Awake()
        {
            Cursor.lockState = CursorLockMode.Locked;
            xClamp = 0;
            FPSController = GetComponentInParent<PlayerMovement>().transform;
        }

        // Use this for initialization
        void Start()
        {
            if (CharacterAnimator)
            {
                Add_FPSCamPositionHelper();
                Add_TPSCamPositionHelper();
            }
        }

        void Add_FPSCamPositionHelper()
        {
            _fpsCameraHelper = new GameObject().transform;
            _fpsCameraHelper.name = "_fpsCameraHelper";
            _fpsCameraHelper.SetParent(CharacterAnimator.GetBoneTransform(HumanBodyBones.Head));
            _fpsCameraHelper.localPosition = Vector3.zero;
        }


        void Add_TPSCamPositionHelper()
        {
            _tpsCameraHelper = new GameObject().transform;
            _tpsCameraHelper.name = "_tpsCameraHelper";
            _tpsCameraHelper.SetParent(FPSController);
            _tpsCameraHelper.localPosition = Vector3.zero;
        }

        // Update is called once per frame
        void Update()
        {
            SwitchCameraPerspectiveInput();

            GetSetPerspective();

            RotateCamera();

        }

        void SwitchCameraPerspectiveInput()
        {
            if(Input.GetButtonDown(SwitchPerspectiveInput))
            {
                if (cameraPerspective == CameraPerspective.FirstPerson)
                {
                    cameraPerspective = CameraPerspective.ThirdPerson;
                }
                else
                {
                    cameraPerspective = CameraPerspective.FirstPerson;
                }
            }

        }

        void GetSetPerspective()
        {
            switch (cameraPerspective)
            {
                case CameraPerspective.FirstPerson:
                    SetCameraHelperPosition_FPS();
                    break;

                case CameraPerspective.ThirdPerson:
                    SetCameraHelperPosition_TPS();
                    break;
            }
        }

        void SetCameraHelperPosition_FPS()
        {
            if (!CharacterAnimator)
                return;

            _fpsCameraHelper.localPosition = FPS_CameraOffset;

            transform.position = _fpsCameraHelper.position;

        }

        void SetCameraHelperPosition_TPS()
        {
            if (!CharacterAnimator)
                return;

            _tpsCameraHelper.localPosition = TPS_CameraOffset;

            transform.position = _tpsCameraHelper.position;

        }

        void RotateCamera()
        {
            float mouseX = Input.GetAxis(MouseXInput) * (mouseSensitivity * Time.deltaTime);
            float mouseY = Input.GetAxis(MouseYInput) * (mouseSensitivity * Time.deltaTime);
            Vector3 eulerRotation = transform.eulerAngles;

            xClamp += mouseY;

            if(cameraPerspective == CameraPerspective.FirstPerson)
                xClamp = Mathf.Clamp(xClamp, FPS_MinMaxAngles.x, FPS_MinMaxAngles.y);
            else
                xClamp = Mathf.Clamp(xClamp, TPS_MinMaxAngles.x, TPS_MinMaxAngles.y);

            eulerRotation.x = -xClamp;
            transform.eulerAngles = eulerRotation;
            FPSController.Rotate(Vector3.up * mouseX);
        }

        private void OnDrawGizmosSelected()
        {
            if (_fpsCameraHelper)
                Gizmos.DrawWireSphere(_fpsCameraHelper.position, 0.1f);

            Gizmos.color = Color.green;

 

 

 

            if (_tpsCameraHelper)
                Gizmos.DrawWireSphere(_tpsCameraHelper.position, 0.1f);
        }
    }
}

 

Ich stelle auch mal noch das Camerascript hier ein.

Über einen "C#-Schubser" würde ich aufatmen...

SB

 

PlayerCamera.unitypackage

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...