ইউনিটি 3 ডি-তে রিজিডবডি জাম্প ফোর্স এবং বাউন্স ম্যাগনিটিউডের সংমিশ্রণ রোধ করা হচ্ছে


10

আমি ইউনিটি 3 ডি তে মোটামুটি সরল মার্বেল রেসিং গেমটি তৈরি করছি। বলটি একটি 3 ডি পদার্থবিজ্ঞান বস্তু যা কেবল এক্স এবং ওয়াই অক্ষগুলিতে চলে moves এটিতে বাম এবং ডান রোল করার এবং লাফানোর ক্ষমতা রয়েছে। খুব বেসিক স্টাফ, ব্যতীত আমি কোনও গেম ব্রেকিং সমস্যায় পড়েছি: মাটিতে পড়ে এবং আঘাত করার সময়, বলের বাউন্সটির মাত্রাটি তার উচ্চতর জাম্প তৈরির জন্য তার জাম্পিং ফোর্সের সাথে একত্রিত করা যেতে পারে। এর অর্থ হ'ল, সময়োপযোগী বোতাম টিপুন দিয়ে প্লেয়ারটি বলটিকে অনাকাঙ্ক্ষিত উচ্চতায় পৌঁছে দিয়ে তাত্পর্যপূর্ণভাবে উচ্চতর বাউন্স করতে পারে। এই সমস্যাটি স্থির না হওয়া পর্যন্ত আমি স্তরগুলি ঠিকঠাকভাবে ডিজাইন করতে পারি না। আমি এই উদাহরণটি চিত্রিত করেছি:

বল বাউন্সিং বনাম বল বাউন্সিং + জাম্পিং

জাম্পিং, কেবল বলটি সোজা উপরের দিকে ফায়ার করার মতো সহজ নয়। স্তর নকশায় আরও জটিলতার সুবিধার্থে, বলটি ঘোরানো পৃষ্ঠের সাথে তুলনামূলকভাবে জাম্প এঙ্গেলটি প্রোগ্রাম করেছি।

বল জাম্প অ্যাঙ্গেল তুলনা

চিত্র 3 , চিত্রটিতে, আমার গেমটি এখন পর্যন্ত কীভাবে কাজ করে; না চিত্র 4 । এটি বাউন্স + জাম্পের সমস্যার সমাধান অনেক বেশি চ্যালেঞ্জিং করে তোলে, কারণ আমি কেবল Y-অক্ষের উপর একটি সঠিক শক্তি বা বেগ পরিমাপ করতে এবং সেট করতে পারি না। এমনটি করার ফলে অদ্ভুত আচরণের ফল পাওয়া যায় যা বল স্টিপার opালুতে ভ্রমণ করার সাথে নাটকীয়ভাবে আরও লক্ষণীয় হয়ে ওঠে।

এখনও অবধি, আমি এই গেমের অন্যান্য সমস্ত ডিজাইনের সমস্যার একটি সমাধান কল্পনা করতে পেরেছি এবং তারপরে কীভাবে সেগুলি প্রোগ্রাম করব তা সন্ধান করতে পেরেছি, তবে এইটি আমাকে আটকে দিয়েছে। আমি বেশ কয়েকটি বিভিন্ন পদ্ধতির চেষ্টা করেছি, কিন্তু তাদের কোনওটিই কাজ করেনি।

এখানে সি # স্ক্রিপ্ট যা বলের জাম্প নিয়ন্ত্রণ করে:

using UnityEngine;
using System.Collections;

public class BallJumping : MonoBehaviour {

    public System.Action onJump;
    public Rigidbody objRigidbody; // Set this to the player
    public bool isGrounded; // Determines whether or not the ball is on the ground
    public Transform groundChecker; // A child object that's slightly larger than the ball
    public float groundRadius = 0.6f;
    public LayerMask whatIsGround; // Determines what layers qualify as ground
    public AudioClip jumpSFX;
    public AudioClip stickyJumpSFX;
    private float p_WillJumpTimeRemaining; // Grace periods before/after hitting the ground to trigger jump
    private float p_CanJumpTimeRemaining;
    public float earlyJumpToleranceDuration = 0.2f;
    public float lateJumpToleranceDuration = 0.2f;
    public float jump = 500f; // Jumping power
    private float halfJump = 250f; // Used for the sticky puddles
    public bool stuck = false; // Used for sticky materials
    private float contactX;
    private float contactY;


    // Input for jumping
    void Update () {
        if (Input.GetButtonDown ("Jump") && isGrounded == true) {
            ProcessJump();
        }
    }


    // Continuously checks whether or not the ball is on the ground
    void FixedUpdate () {
        if (Physics.CheckSphere (groundChecker.position, groundRadius, whatIsGround) == true) {
            isGrounded = true;
        } else {
            isGrounded = false;
        }
    }


    // Sets a grace period for before or after the ball contacts the ground for jumping input
    void ProcessJump () {
        bool boolGetJump = Input.GetButtonDown("Jump");

        if (boolGetJump && isGrounded == false) {
            p_WillJumpTimeRemaining = earlyJumpToleranceDuration;
        } else {
            if (p_WillJumpTimeRemaining > 0) {
                p_WillJumpTimeRemaining -= Time.fixedDeltaTime;
            }
        }

        if (isGrounded) {
            p_CanJumpTimeRemaining = lateJumpToleranceDuration;
        }

        if (isGrounded || p_WillJumpTimeRemaining > 0) {
            Jump();
        }

        if (p_CanJumpTimeRemaining > 0) {
            p_CanJumpTimeRemaining -= Time.fixedDeltaTime;
        }
    }


    // Sticky puddles script -- hinders jumping while in the puddle
    void OnTriggerEnter (Collider collision) {
        if (collision.gameObject.tag == "Sticky") {
            stuck = true;
        }
    }

    void OnTriggerExit (Collider collision) {
        if (collision.gameObject.tag == "Sticky") {
            stuck = false;
        }
    }


    // Calculates the normals for the jump angle
    void OnCollisionStay (Collision collision) {
        Debug.Log ("Collision.");
        foreach (ContactPoint contact in collision.contacts) {
            contactX = contact.normal.x;
            contactY = contact.normal.y;
        }
    }


    // Controls jumping
    void Jump() {
        Debug.Log ("Jump.");
        p_WillJumpTimeRemaining = 0.0f;
        p_CanJumpTimeRemaining = 0.0f;
        halfJump = jump * 0.5f; // Cuts jumping force in half while in a sticky puddle

        GetComponent<AudioSource>().volume = 1;
        GetComponent<AudioSource>().pitch = Random.Range (0.9f, 1.1f);

        if (stuck == false) {
            objRigidbody.AddForce (contactX * jump, contactY * jump, 0);
            GetComponent<AudioSource>().clip = jumpSFX;
            GetComponent<AudioSource>().Play ();
        }
        else if (stuck == true) {
            objRigidbody.AddForce (contactX * halfJump, contactY * halfJump, 0);
            GetComponent<AudioSource>().clip = stickyJumpSFX;
            GetComponent<AudioSource>().Play ();
        }


        if (onJump != null) {
            onJump();
        }
    }
}

আমার সর্বশেষ প্রয়াসটি ছিল লাফ দেওয়ার চেষ্টা - rigidbody.velocity.magnitude * 50 , বলটি যে গতিবেগ করছে তার গতিবেগ দিয়ে জাম্পিং শক্তি হ্রাস করতে। এটি প্রায় বাউন্স + জাম্প সমস্যার সমাধান করে, আনুপাতিকভাবে জাম্প ফোর্সকে শূন্যে নামিয়ে আনার সাথে সাথে বলের গতিবেগকে সমান বলে মনে হয়। এটি স্থবির থেকে কাজ করেছে, তবে সমস্যাটি হচ্ছে, বলটি গ্রাউন্ড করার সময় এটি বিশালতার জন্যও ভূমিকা রাখে, বলটি পুরো গতিতে ঘূর্ণায়মান এবং জাম্পিং থেকে বাধা দেয়। আমি কাছে ছিলাম, তবে বেশ সেখানে ছিলাম না!

আমি একজন শিক্ষানবিশ প্রোগ্রামার, এবং আমি এখানে স্টাম্পড আছি। কেউ কি আমাকে এই সমস্যার সৃজনশীল সমাধান খুঁজতে সাহায্য করতে পারেন? যতক্ষণ না খেলোয়াড় ক্রমাগত বাউন্স করতে এবং উচ্চ এবং উচ্চতর লাফিয়ে উঠতে সক্ষম হয় ততক্ষণ আমি কোনও স্তরের নকশা করতে পারি না, কারণ তারা সকলেই কেবল প্রতারণার শিকার হতে সক্ষম হবে। আমি আরও এগিয়ে যেতে চাই - এই সমস্যাটি আমাকে দীর্ঘদিন ধরে ধরে রেখেছে, তাই আমি কিছু পরামর্শের প্রশংসা করব!


দুর্দান্ত প্রশ্ন :) আপনি কি শারীরিক সামগ্রী দিয়ে ঘুরে দেখার চেষ্টা করেছেন? আপনি স্থলটির বাউনিনেসকে শূন্যে স্থাপন করতে পারেন (বা খুব কম মান)। সম্ভবত খেলোয়াড়ও, এটি নির্ভর করে।
এম 156

উত্তর:


0

প্রথমত, আমি বলতে চাই যে আপনার প্রশ্নটি খুব ভালভাবে লেখা হয়েছে এবং এটি একটি আনন্দের বিষয় :), আপনাকে কোড (অডিওসোর্সেস, ইত্যাদি) এর মধ্যে প্রয়োজনীয় নয় যা অপসারণ করতে হবে এবং এটি নিখুঁত হবে। তার জন্য চিয়ার্স

উত্তরের জন্য, আপনি ঝাঁপ দেওয়ার সময় আপনার বেগটি ক্ল্যাম্প করতে পারেন , যা জাম্প বোতামটি টিপানোর সময় আপনাকে খুব বেশি গতিতে পৌঁছানো থেকে বিরত রাখতে পারে।


0

আমি ব্যক্তিগতভাবে বনি হোপিং পছন্দ করি ... একটি সূচনা পয়েন্ট হিসাবে আমাদের উচিত বোধ করা উচিত "জাম্প স্পিড" একটি ব-দ্বীপের বেগ হিসাবে। এই চিত্রটি একবার লাফানোর তাত্ক্ষণিক সময়ে গতিবেগ বৃদ্ধি ("জাম্প নরমাল" এর সাথে লাইনে) উপস্থাপন করে।

খেলোয়াড় ইতিমধ্যে জাম্প স্বাভাবিকের সাথে সামঞ্জস্য রেখে যে কোনও বেগকে পূর্ব-বিদ্যমান "জাম্প এনার্জি" হিসাবে দেখা যেতে পারে। এটি একটি সরল সমাধানের দিকে নিয়ে যায়: তাত্ক্ষণিক ডেল্টার বেগ এমন সীমাবদ্ধ হতে পারে যে এটি খেলোয়াড়কে লক্ষ্য বেগের বাইরেও ত্বরান্বিত করে না।

আপনার প্রাক-বিদ্যমান জাম্প গতি পরিমাপ করার জন্য, আমরা আপনার জম্পান ভেক্টরকে আপনার স্বাভাবিক করা এবং আপনার প্লেয়ারের গতিবেগের বিন্দু পণ্যটি নিতে পারি:

Vector2 JumpNormal = Vector2(contactX, contactY).normalized;
Vector2 PlayerVelocity = objRigidbody.velocity;
float ExistingSpeed = Vector2.Dot(PlayerVelocity, JumpNormal);
if (ExistingSpeed < 0) ExistingSpeed = 0;

"বিদ্যমান গতি" এখানে নন-নেগেটিভও বাধ্য করে; খেলোয়াড় যখন পড়ছে তখন নেতিবাচক বিদ্যমান জাম্পের গতি তাদের পতনের জন্য ক্ষতিপূরণ দেবে, পড়ার সময় লাফটি সঞ্চার করলে তারা পাতলা বাতাসে ঝাঁকুনির সুযোগ দেয়।

এখন আমরা কীভাবে ডেল্টার বেগকে সুনির্দিষ্টভাবে হ্রাস করতে পারি তা আমরা লক্ষ্যমাত্রা ব-দ্বীপের গতিতে জাম্প নরমালকে স্কেল করে কার্যকর "জাম্প ভেক্টর" গণনা করতে পারি।

float AdjustedSpeed = JumpSpeed - ExistingSpeed;
if (AdjustedSpeed < 0) AdjustedSpeed = 0;
Vector2 JumpVector = JumpNormal * AdjustedSpeed;
objRigidbody.velocity += JumpVector;

এবার অ্যাডজাস্টেড জাম্প স্পিডকে নন-নেগেটিভ করতে বাধ্য করা হচ্ছে; খেলোয়াড় যদি ইতিমধ্যে তাদের লাফ দেওয়ার যোগ্যতার চেয়ে দ্রুত বাড়তে থাকে তবে তারা একটি নেতিবাচক অ্যাডজাস্টেড গতি অর্জন করতে পারে যা তাদের "জাম্প" অ্যাকশনটিকে ব্রেক হিসাবে ব্যবহার করতে দেয়। (তাত্ক্ষণিকভাবে উদ্দিষ্ট জাম্পের গতিতে ধীরে ধীরে!)

দ্রষ্টব্য: আমি বিশ্বাস করি যে আপনার পরিচিতি এক্স এবং ওয়াই ইতিমধ্যে জোড়া হিসাবে স্বাভাবিক হয়েছে ized যদিও সম্পূর্ণতার জন্য আমি সুস্পষ্ট বিবরণ অন্তর্ভুক্ত করেছি।


0

এই উত্তরটি আপনি যা খুঁজছেন তার চেয়ে সম্ভবত একটি নকশা পরিবর্তনের আরও বেশি, তবে এটি সম্পর্কে কীভাবে - বলটি লাফের বোতামটি চাপানোর পরে একটি সামান্য সময় হয় যেখানে এটি স্থিরভাবে মাটিতে থাকে এবং যে কোনও upর্ধ্বমুখী উল্লম্ব গতি বাতিল করে (সম্ভবত একটি স্কোয়াশিং একটি বসন্তের মতো সংকোচন বোঝাতে বিট), তারপরে এই সময়টি শেষ হওয়ার পরে উপরের দিকে লাফিয়ে। এটি বাউন্সের গতিবেগের সমস্যাটিকে লাফাতে যোগ করবে, যদিও এটি খেলোয়াড়দের বাউন্স করেছে বা সবে লাফিয়েছে কিনা তা নিয়ন্ত্রণ করতে পারে। এটি জাম্প ফাংশনে একটি বিলম্বও যুক্ত করে, যা দেখতে ভাল (আরও প্রাকৃতিক বোধ হয়) বা খারাপ হিসাবে দেখা যায় (খেলোয়াড়দের যথেষ্ট সময় সাড়া দেওয়ার অনুমতি দেয় না)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.