Unityক্যে 2 ডি চরিত্র নিয়ন্ত্রণকারী (পুরানো-স্কুল প্ল্যাটফর্মারগুলি ফিরে পাওয়ার চেষ্টা করা)


11

এই দিনগুলিতে আমি withক্যের সাথে 2D চরিত্র নিয়ামক তৈরি করার চেষ্টা করছি (ফিজিক্স ব্যবহার করে)। আমি ফিজিক ইঞ্জিনগুলিতে মোটামুটি নতুন এবং আমি যে নিয়ন্ত্রণের সন্ধান করছি তা পাওয়া সত্যিই কঠিন। আমি যে সমস্যার সমাধান করছি তার সমাধানের জন্য যদি কেউ পরামর্শ দিতে পারে তবে আমি সত্যিই খুশি হব:

এটি এখনই আমার ফিক্সড আপডেট:

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

আমি এখানে বাম এবং ডানদিকে একটি মাধ্যাকর্ষণ এবং একটি রৈখিক বল প্রয়োগ করে অনমনীয় শরীরটি সরাতে এখানে চেষ্টা করছি। আমার কাছে একটি শারীরিক উপাদান সেটআপ আছে যা চলন্ত অবস্থায় কোনও বাউন্স এবং 0 টি ঘর্ষণ করে না এবং 1 টি স্থির স্থানে স্থির থাকে। মূল সমস্যাটি হ'ল আমার কাছে opালু সংঘর্ষকারী এবং গতিবেগ উপরের (ধীরে ধীরে) উপরে যাওয়া থেকে changesালু (দ্রুত) থেকে নেমে যাওয়া এবং সরাসরি স্ট্রাইকাইডারে (স্বাভাবিক) হাঁটা থেকে পরিবর্তন হয়। এটি কীভাবে ঠিক করা যায়? আপনি দেখতে পাচ্ছেন যে আমি এক্স অক্ষের জন্য সবসময় একই বেগ প্রয়োগ করছি।

খেলোয়াড়ের জন্য আমার এটি পাদদেশে একটি গোলকের সাথে সেটআপ করা হয় যা আমি দৃ forces়তার সাথে বাহিনী প্রয়োগ করছি।

এর সাথে আমার জীবন আরও সহজ করতে পারে এমন অন্য কোনও টিপকে স্বাগত জানানো হয় :)।

পিডি বাড়িতে আসার সময় আমি লক্ষ্য করেছি যে আমি প্লেয়ারটি যে পৃষ্ঠের উপরে চলছে তার সমান্তরাল স্থির শক্তি প্রয়োগ করে এটি সমাধান করতে পারি, তবে এটি সেরা পদ্ধতি কিনা তা জানেন না।


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

একটি কাস্টম রাইটিংয়ের সমস্যা হ'ল সংঘর্ষ সনাক্তকরণটি হারিয়ে গেছে। এবং রাইকাস্ট ব্যবহার না করে এটি পুনর্নির্মাণ করা সহজ নয় (পরিবেশের উপর নির্ভর করে ইত্যাদি ... এটি তাদের একগুচ্ছ হতে পারে)। কীভাবে আপনি এই পরিস্থিতি পরিচালনা করবেন?
নোটবাদ

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

1
এই পরিস্থিতিতে ডিফ ডাচ ফিজিক্স।
রায়_গারনার

উত্তর:


7

আপনি যদি পুরানো স্কুল প্ল্যাটফর্মারদের নকল করতে চান তবে প্রথম পদক্ষেপটি পদার্থবিদ্যাকে পুরোপুরি খনন করা। আপনি কোনও পুরাতন স্কুল প্ল্যাটফর্মারের স্থির অ-বাস্তবসম্মত গতি পেতে পদার্থবিজ্ঞানের সাথে লড়াই করার শেষ করবেন। কটাক্ষপাত আছে এই CharacterController প্রতিস্থাপন যে খাদ পদার্থবিদ্যা পুরাপুরি এক উপায় এটি বাস্তবায়ন করতে একটি ভাল ধারণা পেতে।


3

মেহোনার পরামর্শ অনুযায়ী আপনি সম্ভবত আরও সুখী হবেন। তবে আপনি যদি ইউনিটির পদার্থবিজ্ঞান ব্যবহার করতে চলেছেন তবে আপনি সম্ভবত ব্যবহার করতে চান ForceMode.VelocityChange

উদাহরণ:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

আপনার প্রকল্পের পদার্থবিজ্ঞানের সেটিংসেও আপনার বৈশ্বিক মাধ্যাকর্ষণ প্রয়োগ করা উচিত এবং যে বিষয়গুলিতে আপনি দ্রুত পড়তে চান তার জন্য কনস্ট্যান্ট ফোর্স উপাদান যুক্ত করুন

ForceMode.Impulseঅনুরূপ তবে কঠোরতার ভর দ্বারা প্রভাবিত। টিউন করা আরও শক্ত করে তোলে।


2

এমনকি যদি আপনি চরিত্র কন্ট্রোলার উপাদানটি বিল্টটিকে অপছন্দ করেন তবে (যেমন আমি করি), 2D গেমপ্লে টিউটোরিয়ালের জন্য ইউনিটির উদাহরণ কোডটি একবার দেখুন ।

কোডটি ক্যারেক্টার কন্ট্রোলার ব্যবহার করে চলন্ত প্ল্যাটফর্ম, শত্রু এবং সংঘর্ষের বাক্সগুলির সাথে একটি সম্পূর্ণ 2 ডি গেমপ্লে প্রয়োগ করে।

তবে আপনি যদি একবার দেখতে চান না তবে আমি আপনাকে পদার্থবিজ্ঞানের ব্যবহারকে হ্রাস করার পরামর্শ দিচ্ছি এবং এর আচরণটি আপনার নিজের কোড দিয়ে অনুলিপি করার চেষ্টা করব। আপনি কী ধরণের 2 ডি গেমের পরিকল্পনা করছেন তার উপর নির্ভর করে এটি বেশ ভাল কাজ করতে পারে। উদাহরণস্বরূপ, Rigidbody.velocityআপনার চরিত্রটিকে সরিয়ে দেওয়ার জন্য বল প্রয়োগের পরিবর্তে আপনি সরাসরি জগাখিচুড়ি করতে পারেন Transform.Translate(), যা Transform.positionতার অক্ষের উপর ভিত্তি করে অবজেক্টটিকে সরিয়ে দেয় । আপনি এটি নির্ধারণ করতে পারেন forwardএবং backনিজেই অবজেক্টের সাথে বা প্ল্যাটফর্ম বা মেঝে সম্পর্কিত হতে পারেন Transform.up, তাই আপনি জানতে পারবেন এটির একটি র‌্যাম্প এবং প্রকারটি এর কোণটি জানেন।

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

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


আমি যখন unityক্যবদ্ধ হয়ে উঠি তখন প্রথম জিনিসটি ছিল সেই টিউটোরিয়ালটি। সমস্যাটি হ'ল নিয়ন্ত্রণ অনুভূতিটি খুব খারাপ। এই কারণেই আমি আমার নিজের সমাধানটি খুঁজতে চেয়েছিলাম। অন্যদিকে যখন আপনি ট্রান্সফর্ম.ট্রান্সলেট () ব্যবহার করার বিষয়ে মন্তব্য করেন তখন slালু এবং অন্যান্য জিনিস করা এত সহজ নয়। আপনাকে বেশ কয়েকবার কিরণ করতে হবে (মেয়ের জন্য 2 বা 3, নায়কের আকারের উপর নির্ভর করে আপনি যেদিকে যাচ্ছেন তার জন্য আরও)। মোবাইল ডিভাইসের জন্য রাইকাস্ট ভাল নয়, এবং কম যদি আপনি সংঘর্ষ সনাক্তকরণের পুনরাবৃত্তির জন্য 5..n করতে চান তবে কম। সম্ভবত আমি ভুল হতে পারি, তবে আমি তা মনে করি না।
নোটবাদ

1

আপনি এটি ক্যারেক্টার কন্ট্রোলারে অন্তর্নির্মিত চান । step offsetএই উপাদানটিতে সম্পত্তি সেট করে আপনি কোনও খেলোয়াড়কে স্বাচ্ছন্দ্যে উপরে এবং নীচে opালু স্থানটিতে স্থান পেতে পারেন।


মন্তব্য না করার জন্য দুঃখিত আমি unityক্যের একটি ক্যারেক্টার কন্ট্রোলার পেয়েছি এবং এটি বেশ কয়েকবার ব্যবহার করেছি, তবে এটি কীভাবে আচরণ করে তা আমি পছন্দ করি না। এটি কেবলমাত্র এফপিএসের জন্য উপযুক্ত প্ল্যাটফর্মের খেলা নয়, যেখানে মোশন মেকানিক্স সর্বাধিক আমদানিকর জিনিস।
নোটবাদ

আমি মনে করি আপনি একবার ক্যারেক্টার কন্ট্রোলারের সেটিংসের সাথে ঝাঁকুনি দিলে এটি ভাল কাজ করে। আপনি কি অভাব খুঁজে পেলেন?
NoobsArePeople2

প্রথম জিনিসটি আমি পছন্দ করি না তা হ'ল এটি কিছু রে কাস্টযুক্ত সাধারণ অনমনীয় দেহের তুলনায় ধীর। কীভাবে এটি অর্জন করবেন তা জেনে, আমি মনে করি আমি আরও হালকা ওজন নিয়ন্ত্রণকারী করতে পারি। আরেকটি সমস্যা হ'ল প্ল্যাটফর্ম প্রান্তগুলিতে ক্যাপসুল / গোলকের অদ্ভুত আচরণ হওয়া (এটি আরও কিছু রশ্মির সাহায্যে সমাধান করা যেতে পারে)। এই কারণেই আমি আমার নিজের রোল করতে চাই।
নোটবাদ

0

এখানে চিত্র বর্ণনা লিখুনআমি মনে করি এটি এ কারণে যে বলটি প্ল্যাটফর্মের সমান্তরাল নয় এবং ফল উত্থানে কম এবং উত্থানের চেয়েও উচ্চতর হয়।

আপনি যদি সমন্বয় ব্যবস্থাতে আপেক্ষিক শক্তি প্রয়োগ করেন apply

AddRelativeForce

আপনি সর্বাধিক গতি "x" এ রাখতে চান এবং এটি একটি স্কেলারের সাথে তুলনা করতে চান, মনে রাখবেন যে গতিটি একটি ভেক্টর এবং রচনা করুন ভিএক্স এবং ভি, সমতল ভূখণ্ডে শূন্য, তবে অগত্যা opালু শূন্যের চেয়ে বেশি is

গতি দেহের দিকনির্দেশনা অনুসারে পরিবর্তিত হয়, এবং এর সম্পর্কিত vx এর সামগ্রিক vx এর সাথে সম্পর্কিত পরিবর্তন হয়

এটি আপনার ভিটিকে এমনভাবে পরিবর্তন করতে পারে যে আপনি খুব চান না:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

একই গ্লোবাল ভিএক্স বজায় রাখা চোখে অদ্ভুত লাগতে পারে। (অবাঞ্ছিত ত্বরণ)

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