Advertisement
nemszabo

PlayerMovement

Jul 17th, 2025 (edited)
118
0
17 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.30 KB | Gaming | 0 0
  1. using _FDP_;
  2. using System.Security.Cryptography;
  3. using UnityEngine;
  4.  
  5. /// P: Player
  6. [RequireComponent(typeof(Rigidbody))]
  7. public class P_Movement_Control : FDP_UpdatingControl_Base {
  8.     #region Variables
  9.     private SP_Input_Control input_c;
  10.     private P_Sprint_Control sprint_c;
  11.     private P_Attack_Control attack_c;
  12.  
  13.     public Rigidbody body;
  14.     public Transform camAnchor_tf;
  15.     public Animator animator;
  16.  
  17.     public float moveSmoothTime = 0.25f;
  18.     Vector3 vecVelocity = Vector3.zero;
  19.     float fVelocity = 0f;
  20.  
  21.     public float rotationSmoothTime = 0.05f;
  22.     Vector3 rotVecVelocity = Vector3.zero;
  23.     float rotFVelocity = 0f;
  24.  
  25.     public float speed = 5f;
  26.     /// jelenleg a soundEffects_c-ben használjuk
  27.     public bool isMoving;
  28.  
  29.     /// A játékos lehetséges állapotai a mozgás vezérléséhez.
  30.     public enum MovementState {
  31.         Normal,    // Normál mozgás input alapján
  32.         Attack,    // Támadás közbeni állapot
  33.         Falling,   // Leesés közbeni korlátozott mozgás
  34.         Interact   // Interakciós (pl. beszélgetés, elemek kezelése)
  35.     }
  36.     [SerializeField] private MovementState movementState  = MovementState.Normal;
  37.  
  38.     [Header("Ground Check beállítások")]
  39.     public Transform groundCheck;       // Az üres GameObject (lábaid magasságában)
  40.     public float groundDistance = 0.2f;  // Raycast félátmérő
  41.     public LayerMask groundMask;        // Talaj réteg
  42.     [SerializeField] private bool isGrounded; // Változó
  43.  
  44.     [Space(5)]
  45.     [Header("DEBUG")]
  46.  
  47.     private FDP_DelegateVConnector<float> fdpDlgt_SpeedMultiplierChange;
  48.     private float actualSpeed;
  49.     #endregion
  50.  
  51.     #region Setup
  52.     protected void PreSetup(P_Master_Control playerMaster_c) {
  53.         input_c = SP_Input_Control.instance;
  54.         sprint_c = GetComponent<P_Sprint_Control>();
  55.         attack_c = playerMaster_c.attack_c;
  56.  
  57.         body = GetComponent<Rigidbody>();
  58.  
  59.         camAnchor_tf = playerMaster_c.camera_c.transform;
  60.  
  61.         actualSpeed = speed;
  62.  
  63.         fdpDlgt_SpeedMultiplierChange = new FDP_DelegateVConnector<float>(
  64.             this, SpeedMultiplierChanged, $"P_Sprint_Control:OnSpeedMultiplierChange"
  65.         );
  66.     }
  67.     protected override void PreSetup() {
  68.         throw FDP_ErrorHandler.NewError(
  69.             $"QCSERROR: P_Movement_Control:PreSetup: Használd a PreSetup(Transform camAnchorTransform) függvényt!" +
  70.             "\nA PreSetup függvényt a P_Master_Control paraméterrel kell meghívni." +
  71.             "\nEllenőrizd, hogy a megfelelő master script megfelelően inicializálja ezt a komponenst."
  72.         );
  73.     }
  74.  
  75.     public void Setup(
  76.         P_Master_Control playerMaster_c
  77.     ) {
  78.         if (debugLog) Debug.Log($"{this}.Setup...");
  79.  
  80.         PreSetup(playerMaster_c);
  81.  
  82.         CheckPreSetupOk();
  83.  
  84.         sprint_c.OnSpeedMultiplierChange.Add(fdpDlgt_SpeedMultiplierChange);
  85.  
  86.         setupDone = true;
  87.         enabled = setupDone;
  88.         if (debugLog) Debug.Log($"{this}:Setup done\n");
  89.     }
  90.  
  91.     public override void Setup() {
  92.         throw FDP_ErrorHandler.NewError(
  93.             $"QCSERROR: P_Movement_Control: Setup() nem hívható meg paraméter nélkül!" +
  94.             "\nA Setup függvényt a P_Master_Control paraméterrel kell meghívni." +
  95.             "\nEllenőrizd, hogy a megfelelő master script megfelelően inicializálja ezt a komponenst."
  96.         );
  97.     }
  98.     #endregion
  99.  
  100.     #region Updates
  101.     private Vector3 lastLookDirection = Vector3.zero;
  102.     void FixedUpdate() {
  103.  
  104.         // 1) Talajdetekció (GroundCheck)
  105.         GroundCheck();
  106.  
  107.         // 2) Falling státusz ellenőrzése
  108.         CheckFalling();
  109.  
  110.         // 3) State switch – minden állapotot külön metódusban kezelünk
  111.         switch (movementState) {
  112.             case MovementState.Normal:
  113.                 MovementStateNormal_Settings();   // Ha a Játékos állapot nélküli akkor a Freeze ki kapcsolva
  114.                 break;
  115.  
  116.             case MovementState.Attack:
  117.                 MovementStateAttack_Settings();   // Ha a Játékos attackol akkor a mozgás Freezelve van!
  118.                 break;
  119.  
  120.             case MovementState.Falling:
  121.                 MovementStateFalling_Settings();  // Ha a Játékos valahonnan leseik, az riányitás kikapcsol de a mozgás direction megmarad gravitációval
  122.                 break;
  123.  
  124.             case MovementState.Interact:
  125.                 //body.velocity = new Vector3(0f, body.velocity.y, 0f);
  126.                 break;
  127.         }
  128.         // Ez felel a teljes forgás/irányításért! [Eredeti változtatások nélkül]
  129.         BaseMovementControll();
  130.     }
  131.  
  132.     void Update() {
  133.         float animSpeed = (movementState == MovementState.Falling)? 0f: body.velocity.magnitude;
  134.         animator.SetFloat("velocity", animSpeed);
  135.     }
  136.     #endregion
  137.  
  138.     //EXTRA SPEEDET A BUFFBOL BEKOTNI
  139.     #region Functions
  140.     private void SpeedMultiplierChanged(float spendMultiplier) {
  141.         if (debugLog) Debug.Log($"SpeedMultiplierChanged {spendMultiplier}");
  142.         actualSpeed = speed * spendMultiplier;
  143.     }
  144.  
  145.     public void ChangeMovementState(MovementState newState) {
  146.         this.movementState = newState;
  147.     }
  148.  
  149.     //================Player Mozgás Logika===========\\
  150.     //Normál Mozgás
  151.  
  152.     private void BaseMovementControll()
  153.     {
  154.         if (movementState == MovementState.Falling || !isGrounded)
  155.             return;
  156.  
  157.         if (input_c.horizontalInput != 0 || input_c.verticalInput != 0) {
  158.             isMoving = true;
  159.             Vector3 moveDirection = new Vector3(input_c.horizontalInput, 0, input_c.verticalInput);
  160.             // maximalizáljuk a mozgás irány vektor hosszát 1-re
  161.             moveDirection = Vector3.ClampMagnitude(moveDirection, 1);
  162.  
  163.             // a camAnchor és a saját transform elforgatása alapján a kamera, talajra vetített irányvektorát használjuk
  164.             float camAngle = camAnchor_tf.eulerAngles.y;
  165.             moveDirection = Quaternion.Euler(0, camAngle, 0) * moveDirection;
  166.  
  167.             // Preserve the current velocity's y-component (gravity effect)
  168.             Vector3 velocity = body.velocity;
  169.             velocity.x = actualSpeed * moveDirection.x;
  170.             velocity.z = actualSpeed * moveDirection.z;
  171.             body.velocity = velocity;
  172.  
  173.             if (moveDirection != Vector3.zero) {
  174.                 // a moveDirection-ra apply-olunk egy elfordulást, hogy a karakter ne instant forduljon a mozgás irányába
  175.                 moveDirection = Vector3.SmoothDamp(
  176.                     transform.forward,
  177.                     moveDirection.normalized,
  178.                     ref rotVecVelocity,
  179.                     rotationSmoothTime
  180.                 );
  181.                 // a karakter elfordulása a mozgás irányába az y tengely körül
  182.             }
  183.  
  184.             lastLookDirection = attack_c.attackDirection != Vector3.zero ?
  185.                 attack_c.attackDirection.normalized :
  186.                 moveDirection;
  187.         }
  188.         else if (attack_c.attackDirection != Vector3.zero) {
  189.             isMoving = false;
  190.            
  191.             // a attackDirection-ra apply-olunk egy elfordulást,
  192.             // hogy a karakter ne instant forduljon a támadás irányába
  193.             lastLookDirection = Vector3.SmoothDamp(
  194.                 transform.forward,
  195.                 attack_c.attackDirection.normalized,
  196.                 ref rotVecVelocity,
  197.                 rotationSmoothTime
  198.             );
  199.         } else {
  200.             isMoving = false;
  201.         }
  202.  
  203.         if (lastLookDirection != Vector3.zero) {
  204.             transform.rotation = Quaternion.LookRotation(lastLookDirection);
  205.         }
  206.     }
  207.  
  208.     private void GroundCheck() {
  209.         // Talajon vagyok-e?
  210.         isGrounded = Physics.CheckSphere(
  211.             groundCheck.position,
  212.             groundDistance,
  213.             groundMask
  214.         );
  215.     }
  216.  
  217.     private void CheckFalling()
  218.     {
  219.         //Ha nem Falling & és nem grounded
  220.         if (!isGrounded && movementState != MovementState.Falling)
  221.         {
  222.             //TODO: Változtassa meg a Movement state-t Falling-ra
  223.             ChangeMovementState(MovementState.Falling);
  224.  
  225.             //Animáció lejátszása
  226.         }
  227.         else if (isGrounded && movementState == MovementState.Falling) {
  228.             ChangeMovementState(MovementState.Normal);
  229.         }
  230.     }
  231.  
  232.     private void MovementStateNormal_Settings()
  233.     {
  234.         // Vedd le a FreezePositionX és FreezePositionZ zászlókat
  235.         body.constraints &= ~(RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ);
  236.     }
  237.  
  238.     private void MovementStateAttack_Settings()
  239.     {
  240.         body.velocity = new Vector3(0f, body.velocity.y, 0f);
  241.  
  242.         // constraints: csak pozíció X/Z és X-Z forgás tiltása
  243.         body.constraints = RigidbodyConstraints.FreezePositionX
  244.                          | RigidbodyConstraints.FreezePositionZ
  245.                          | RigidbodyConstraints.FreezeRotationX
  246.                          | RigidbodyConstraints.FreezeRotationZ;
  247.     }
  248.  
  249.     private void MovementStateFalling_Settings()
  250.     {
  251.         // Falling: horizontális velocity megtartása, gravitáció-t a RigidBody Use Gravity kezeli
  252.         // lastLookDirection már BaseMovementControll beállítódott, amikor Falling-olunk
  253.         Vector3 horizontalVelocity = lastLookDirection.normalized * actualSpeed;
  254.  
  255.         body.velocity = new Vector3(
  256.                 horizontalVelocity.x,
  257.                 body.velocity.y,    // gravitáció továbbra is hat
  258.                 horizontalVelocity.z
  259.          );
  260.     }
  261.  
  262.     #endregion
  263.  
  264.     #region Checks
  265.     protected override void CheckPreSetupOk() {
  266.         if (!input_c) {
  267.             throw FDP_ErrorHandler.NewError(
  268.                 $"QCSERROR: input_c HIÁNYZIK! Character_Control:{this}" +
  269.                 "\nAz Input Control singleton nem található." +
  270.                 "\nEllenőrizd, hogy az SP_Input_Control megfelelően inicializálva van-e a játékban."
  271.             );
  272.         }
  273.         if (!body) {
  274.             throw FDP_ErrorHandler.NewError(
  275.                 $"QCSERROR: body HIÁNYZIK! Character_Control:{this}" +
  276.                 "\nA Rigidbody komponens nem található a GameObject-en." +
  277.                 "\nEllenőrizd, hogy a RequireComponent attribútum megfelelően működik-e."
  278.             );
  279.         }
  280.         if (!camAnchor_tf) {
  281.             throw FDP_ErrorHandler.NewError(
  282.                 $"QCSERROR: camAnchor_tf HIÁNYZIK! Character_Control:{this}" +
  283.                 "\nA kamera anchor Transform nem található." +
  284.                 "\nEllenőrizd, hogy a P_Master_Control megfelelően be van állítva és tartalmazza a camera_c referenciát."
  285.             );
  286.         }
  287.         if (!animator) {
  288.             throw FDP_ErrorHandler.NewError(
  289.                 $"QCSERROR: animator HIÁNYZIK! Character_Control:{this}" +
  290.                 "\nAz Animator komponens nincs beállítva." +
  291.                 "\nHúzd be a megfelelő Animator komponenst az Inspectorban."
  292.             );
  293.         }
  294.         if (speed <= 0) {
  295.             throw FDP_ErrorHandler.NewError(
  296.                 $"QCSERROR: speed <= 0! Character_Control:{this}" +
  297.                 "\nA mozgás sebességnek nagyobbnak kell lennie 0-nál." +
  298.                 "\nÁllítsd be a megfelelő értéket az Inspectorban."
  299.             );
  300.         }
  301.     }
  302.     #endregion
  303. }
  304.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement