مشکل در عمکلرد بازی برای نشستن و دویدن

geddis

عضویت : 1398/07/17 پرسش ها : 7 پاسخ ها : 5

مشکل در عمکلرد بازی برای نشستن و دویدن

ارسال شده در : ‫۱ ماه قبل، سه شنبه ۱۳ اسفند ۱۳۹۸، ساعت ۲۳:۳۳

سلام استاد زمانی که کد رو سیو می کنم این ارور رو میده Object reference not set to an instance of an object ولی وقتی پلی می کنم بازی رو ، ارور حذف می شه ولی توی بازی وقتی F رو می زنم نمی شینه مجبورم فشار بدم که یهویی میره زیر زمین همچنین اگر بخوام Q رو بزنم و بدوم کار نمی کنه مشکلش کجاست ممنونم می شم راهنماییم کنید . 

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

public class control : MonoBehaviour {   
    private Transform firstPerson_View;
    private Transform firstPerson_camera;

    private Vector3 firstPerson_View_Rotation = Vector3.zero;

    public float walkSpeed = 8f;
    public float runSpeed = 12f;
    public float crouchSpeed = 5f;
    public float jumpSpeed = 9f;
    public float gravitySpeed = 10f;

    private float speed;

    private bool is_Moving, is_Grounded, is_crouching; 

    private float inputX, inputY; 
    private float inputX_Set, inputY_Set;
    private float inputModifyFactor;

    private bool limitDiagonaSpeed = true;

    private float antiBumpFactor = 0.75f;

    private CharacterController charController;
    private Vector3 moveDirection = Vector3.zero;
    public LayerMask groundLayer;
    private float rayDistance;
    private float default_ControllerHeight;
    private Vector3 default_CamPos;
    private float camHeight;
    // Start is called before the first frame update
    void Start() {
        firstPerson_View = transform.Find ("FPS View").transform;
        charController = GetComponent<CharacterController> ();
        speed = walkSpeed;
        is_Moving = false;
        rayDistance = charController.height * 0.5f + charController.radius;
        default_ControllerHeight = charController.height;
        default_CamPos = firstPerson_View.localPosition;
    }

    // Update is called once per frame
    void Update()
    {   PlayerMovement();
        
    }
    void PlayerMovement() {
        PlaryerCroughingAndSprinting();
        if (Input.GetKey (KeyCode.W) || Input.GetKey (KeyCode.S)) {
            if (Input.GetKey (KeyCode.W)) {
                inputY_Set = 1f;
            } else {
                inputY_Set = -1f;
            }
        } else {
            inputY_Set = 0f;
    }
            
        if (Input.GetKey (KeyCode.A) || Input.GetKey (KeyCode.D)) {
            if (Input.GetKey (KeyCode.A)) {
                inputX_Set = -1f;
            } else {
                inputX_Set = 1f;
            }
        } else {
            inputX_Set = 0f;
        }

        inputY = Mathf.Lerp (inputY, inputY_Set, Time.deltaTime * 19f);
        inputX = Mathf.Lerp (inputX, inputX_Set, Time.deltaTime * 19f);

        inputModifyFactor = Mathf.Lerp (inputModifyFactor,
            (inputY_Set != 0 && inputX_Set != 0 && limitDiagonaSpeed) ? 0.75f : 1.0f,Time.deltaTime * 19f);

        firstPerson_View_Rotation = Vector3.Lerp (firstPerson_View_Rotation, Vector3.zero, Time.deltaTime * 5f);
        firstPerson_View.localEulerAngles = firstPerson_View_Rotation;

        if (is_Grounded) {
            moveDirection = new Vector3 (inputX * inputModifyFactor, -antiBumpFactor, inputY * inputModifyFactor);

            moveDirection = transform.TransformDirection (moveDirection) * speed;
        PlayerJump();
        }

        moveDirection.y -= gravitySpeed * Time.deltaTime;

        is_Grounded = (charController.Move(moveDirection * Time.deltaTime) & CollisionFlags.Below) != 0;
        is_Moving = charController.velocity.magnitude > 0.15f;
    } 
    void PlaryerCroughingAndSprinting() {
        if (Input.GetKeyDown (KeyCode.F)) {
            if (!is_crouching) {
                is_crouching = true;
            } else {
                if(cangetup ()) {
                    is_crouching = false;
                }
            StopCoroutine (MoveCameraCrouch());
            StartCoroutine (MoveCameraCrouch());
            }
        if (is_crouching) {
            speed = crouchSpeed;
        } else {
            if (Input.GetKey (KeyCode.E)) {
                speed = runSpeed;
            } else {
                speed = walkSpeed;
            }
            
        }
        }
    }

    bool cangetup() {
        Ray groundRay = new Ray (transform.position, transform.up);
        RaycastHit groundHit;
        if(Physics.SphereCast (groundRay, charController.radius + 0.5f, out groundHit, rayDistance, groundLayer)) {
            if(Vector3.Distance(transform.position, groundHit.point) < 2.3f) {
                return false;

            }


        }


        return false;
    }
    IEnumerator MoveCameraCrouch() {
        charController.height = is_crouching ? default_ControllerHeight / 1.5f : default_ControllerHeight;
        charController.center = new Vector3 (0f, charController.height / 2f, 0f);
        camHeight = is_crouching ? default_CamPos.y / 1.5f : default_CamPos.y;
        while (Mathf.Abs (camHeight - firstPerson_View.localPosition.y) > 0.1f)
        {
           firstPerson_View.localPosition = Vector3.Lerp (firstPerson_View.localPosition, new Vector3(default_CamPos.x, camHeight, default_CamPos.z), Time.deltaTime * 11f );
           yield return null;
        }
    }

    void PlayerJump() {
        if (Input.GetKeyDown (KeyCode.Q)) {
            if (is_crouching) {
                if (cangetup ()) {
                    is_crouching = false;

                    StopCoroutine (MoveCameraCrouch());
                    StartCoroutine (MoveCameraCrouch());

                }

            } else {
                moveDirection.y = jumpSpeed;
                
            }
        }
    }
}

 

برای ارسال پاسخ باید وارد شوید و یا در سایت عضو شوید