ইউনিটি ব্যবহার করে আমি কীভাবে খেলোয়াড়ের চলাচলকে কোনও 3 ডি অবজেক্টের পৃষ্ঠে সীমাবদ্ধ রাখতে পারি?


16

আমি মারিও গ্যালাক্সি বা জ্যামিতি ওয়ার্স 3 এর অনুরূপ একটি প্রভাব তৈরি করার চেষ্টা করছি যেখানে প্লেয়ারটি "গ্রহ" মহাকর্ষের চারপাশে হাঁটতে দেখলে মনে হয় সামঞ্জস্য হয় এবং তারা যদি অভিকর্ষটির প্রান্ত থেকে পড়ে না তবে তারা যদি মহাকর্ষ বলে একক দিকে স্থির ছিল।

এখানে চিত্র বর্ণনা লিখুন
(সূত্র: গেমসকিনি.কম )

জ্যামিতি যুদ্ধ 3

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

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

প্লেয়ারকে অবজেক্টগুলির তলদেশে নেওয়ার জন্য আমার কী ধরণের পদ্ধতির উচিত? দ্রষ্টব্য যে সমাধানটি 3 ডি স্পেসে কাজ করতে হবে (2D এর বিপরীতে) এবং ইউনিটির মুক্ত সংস্করণ ব্যবহার করে কার্যকর করা উচিত।


সম্ভাব্য প্রতিলিপি: gamedev.stackexchange.com/questions/47220/... এবং gamedev.stackexchange.com/questions/71585/...
MichaelHouse

এমনকি দেয়ালে হাঁটার জন্য অনুসন্ধান করার কথা ভাবিও নি। আমি একবার দেখে নেব এবং এই সাহায্যগুলি কিনা তা দেখুন।
স্পার্টনডুনট

1
এই প্রশ্নটি যদি 3Dক্যতে 3 ডি করে করার বিষয়ে বিশেষভাবে হয় তবে এটি সম্পাদনাগুলি দিয়ে আরও পরিষ্কার করা উচিত। (এটি তখনকার বিদ্যমান বিদ্যমানটির সঠিক সদৃশ হবে না ))
আঙ্কো

এটি আমার সাধারণ অনুভূতিটিও - আমি দেখতে যাচ্ছি যে আমি সেই সমাধানটি 3 ডি তে মানিয়ে নিতে পারি এবং উত্তর হিসাবে পোস্ট করতে পারি (বা অন্য কেউ যদি আমাকে ঘুষিতে মারতে পারে তবে আমিও তার সাথে ভাল আছি)। আমি আরও চেষ্টা করব এবং আমার প্রশ্নটি আপডেট করব on
স্পার্টানডনট

সম্ভাব্য সহায়ক: youtube.com/watch?v=JMWnufriQx4
এসএসবি

উত্তর:


7

আমি আমার যা প্রয়োজন প্রয়োজন তা সম্পাদন করতে সক্ষম হয়েছি, প্রাথমিকভাবে ধাঁধাটির ধরণের পৃষ্ঠের জন্য এই ব্লগ পোস্টটির সহায়তায় এবং প্লেয়ারের গতিবিধি এবং ক্যামেরার জন্য আমার নিজস্ব ধারণাগুলি নিয়ে এসেছি।

খেলোয়াড়কে কোনও বস্তুর সারফেসে স্নেপিং করা

বেসিক সেটআপটিতে একটি বৃহত গোলক (বিশ্ব) এবং একটি ছোট গোলক (প্লেয়ার) উভয়ই থাকে যার সাথে গোলকের সাথে সংযুক্ত থাকে coll

বেশিরভাগ কাজ করা হচ্ছে নিম্নলিখিত দুটি পদ্ধতিতে:

private void UpdatePlayerTransform(Vector3 movementDirection)
{                
    RaycastHit hitInfo;

    if (GetRaycastDownAtNewPosition(movementDirection, out hitInfo))
    {
        Quaternion targetRotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
        Quaternion finalRotation = Quaternion.RotateTowards(transform.rotation, targetRotation, float.PositiveInfinity);

        transform.rotation = finalRotation;
        transform.position = hitInfo.point + hitInfo.normal * .5f;
    }
}

private bool GetRaycastDownAtNewPosition(Vector3 movementDirection, out RaycastHit hitInfo)
{
    Vector3 newPosition = transform.position;
    Ray ray = new Ray(transform.position + movementDirection * Speed, -transform.up);        

    if (Physics.Raycast(ray, out hitInfo, float.PositiveInfinity, WorldLayerMask))
    {
        return true;
    }

    return false;
}

দ্য Vector3 movementDirectionপ্যারামিটার ঠিক যেমন শোনাচ্ছে হয়, দিক আমরা যখন আপ এই উদাহরণে অপেক্ষাকৃত সহজ শেষ হয়েছে এই ফ্রেমটি আমাদের খেলোয়াড় চলন্ত করা, এবং যে ভেক্টর গণক, যাচ্ছি, আমাকে প্রথমে জিনিসটা জন্য আরেকটু চতুর ছিল। এর পরে আরও, তবে কেবল মনে রাখবেন যে খেলোয়াড় এই ফ্রেমটি যে দিকে নিয়ে যাচ্ছে সেদিকে এটি একটি স্বাভাবিক ভেক্টর।

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

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

ক্যামেরা এবং মুভমেন্ট

একবার প্লেয়ারটি যখন বস্তুর পৃষ্ঠের সাথে লেগেছিল তখন মোকাবেলা করার জন্য পরবর্তী কাজটি ছিল চলাচল। আমি মূলত খেলোয়াড়ের তুলনায় আন্দোলন শুরু করেছিলাম কিন্তু আমি গোলকের খুঁটিগুলিতে ইস্যুগুলি শুরু করতে শুরু করেছি যেখানে হঠাৎ দিকনির্দেশগুলি পরিবর্তিত হয়ে আমার খেলোয়াড়কে দ্রুত দিক বদলে দেয় এবং আমাকে কখনও খুঁটি না দিয়ে দেয়। আমি যা করছিলাম তা ছিল আমার খেলোয়াড়দের ক্যামেরার সাথে তুলনা করে আন্দোলন করা।

আমার প্রয়োজনগুলির জন্য যা ভাল কাজ করেছে তা হ'ল একটি ক্যামেরা থাকা যা কেবলমাত্র খেলোয়াড়ের অবস্থানের ভিত্তিতে প্লেয়ারকে কঠোরভাবে অনুসরণ করেছিল। ফলস্বরূপ, ক্যামেরাটি প্রযুক্তিগতভাবে ঘোরার পরেও টিপতে সর্বদা প্লেয়ারটিকে পর্দার শীর্ষে, নীচের দিকে এবং অন্যদিকে বাম এবং ডানদিকে নিয়ে যায়।

এটি করতে, নিম্নলিখিতটি ক্যামেরাটিতে কার্যকর করা হয়েছিল যেখানে লক্ষ্য বস্তুটি প্লেয়ার ছিল:

private void FixedUpdate()
{
    // Calculate and set camera position
    Vector3 desiredPosition = this.target.TransformPoint(0, this.height, -this.distance);
    this.transform.position = Vector3.Lerp(this.transform.position, desiredPosition, Time.deltaTime * this.damping);

    // Calculate and set camera rotation
    Quaternion desiredRotation = Quaternion.LookRotation(this.target.position - this.transform.position, this.target.up);
    this.transform.rotation = Quaternion.Slerp(this.transform.rotation, desiredRotation, Time.deltaTime * this.rotationDamping);
}

পরিশেষে, প্লেয়ারটিকে সরিয়ে নিতে, আমরা মূল ক্যামেরার রূপান্তরকে কাজে লাগিয়েছিলাম যাতে আমাদের নিয়ন্ত্রণগুলি উপরে উঠে যায়, নিচে নেমে যায় ইত্যাদি And এবং এটি এখানে আমরা আপডেটপ্লেয়ারট্রান্সফর্ম কল করি যা আমাদের অবস্থানটিকে বিশ্ব বস্তুতে ফেলে যায়।

void Update () 
{        
    Vector3 movementDirection = Vector3.zero;
    if (Input.GetAxisRaw("Vertical") > 0)
    {
        movementDirection += cameraTransform.up;
    }
    else if (Input.GetAxisRaw("Vertical") < 0)
    {
        movementDirection += -cameraTransform.up;
    }

    if (Input.GetAxisRaw("Horizontal") > 0)
    {
        movementDirection += cameraTransform.right;
    }
    else if (Input.GetAxisRaw("Horizontal") < 0)
    {
        movementDirection += -cameraTransform.right;
    }

    movementDirection.Normalize();

    UpdatePlayerTransform(movementDirection);
}

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


3

আমি মনে করি এই ধারণাটি কার্যকর হবে:

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

এখন, গ্রহের সাধারণ ভেক্টরটি কোন বিন্দুর ভিত্তিতে গণনা করা উচিত?

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

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


একটি সর্বশেষ নোট: আরও ভাল ফলাফলের জন্য, আপনি নিম্নলিখিতগুলিও করতে পারেন: প্রতিটি ফ্রেমে প্লেয়ারের গতিবিধির উপর নজর রাখুন (যেমন ব্যবহার করা current_position - last_position)। তারপরে movement_vectorএমনভাবে চাপ দিন যাতে এটির অবজেক্টের দিকে দৈর্ঘ্য upশূন্য হয়। আসুন এই নতুন ভেক্টর কল reference_movement। পূর্ববর্তী reference_pointদ্বারা সরান reference_movementএবং এই নতুন বিন্দুটি ট্রে ট্রেসিং উত্স হিসাবে ব্যবহার করুন। (এবং যদি) রশ্মি গ্রহে reference_pointআঘাত হানার পরে , সেই হিট পয়েন্টে চলে যান। অবশেষে, upএই নতুন থেকে নতুন ভেক্টরটি গণনা করুন reference_point

এটি সংক্ষেপে কিছু সিউডো কোড:

update_up_vector(player:object, planet:mesh)
{
    up_vector        = normalize(planet.up);
    reference_point  = ray_trace (object.old_position, -up_vector, planet);
    movement         = object.position - object.old_position;
    movement_clamped = movement - up_vector * dot (movement, up_vector);

    reference_point  += movement_clamped;
    reference_point  = ray_trace (reference_point, -up_vector, planet);
    player.up        = normal_vector(mesh, reference_point);
}

2

এই পোস্ট সহায়ক হতে পারে। এর সংক্ষিপ্তসারটি হ'ল, আপনি চরিত্র নিয়ন্ত্রকগুলি ব্যবহার করবেন না, তবে পদার্থবিজ্ঞানের ইঞ্জিন ব্যবহার করে নিজের তৈরি করুন। তারপরে আপনি প্লেয়ারের নীচে সনাক্ত করা নরমালগুলি জাল পৃষ্ঠের দিকে চালিত করতে ব্যবহার করুন।

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

ইউনিট 3..০ এর একটি ডেমো প্রকল্পও রয়েছে যার একটি ওয়াকিং ইঞ্জিন ছিল, একজন সৈনিক এবং একটি কুকুর এবং একটি দৃশ্যে। এটি 3 ডি অবজেক্ট গ্যালাক্সি স্টাইলে হাঁটা প্রদর্শন করেছে । এটিকে রানওভিশন দ্বারা লোকমোশন সিস্টেম বলা হয় ।


1
প্রথম নজরে ডেমো খুব ভাল কাজ করে না এবং ইউনিটি প্যাকেজটিতে ত্রুটি তৈরি হয়েছে। আমি এই কাজটি করতে পারি কিনা তা দেখতে পাব তবে আরও একটি সম্পূর্ণ উত্তর প্রশংসা করবে।
স্পার্টানডোনট

2

ঘূর্ণন

এই প্রশ্নের উত্তরে উত্তর.িউনিটি 3 ডটকম (প্রকৃতপক্ষে আমি নিজেই জিজ্ঞাসা করেছি) এ উত্তরটি দেখুন । উদ্ধৃতি:

প্রথম কাজটি হ'ল একটি ভেক্টর যা সংজ্ঞায়িত হয় get আপনার অঙ্কন থেকে, আপনি এটি দুটি উপায়ে একটিতে করতে পারেন। আপনি গ্রহটিকে একটি গোলক হিসাবে বিবেচনা করতে পারেন এবং ব্যবহার করতে পারেন (অবজেক্ট.পজিশন - গ্রহ.পজিশন)। দ্বিতীয় উপায় হ'ল কলাইডার.রায়াস্ট () ব্যবহার করুন এবং এটি 'হিট.নরমাল' ব্যবহার করবে returns

তিনি আমাকে যে পরামর্শটি দিয়েছেন তা এখানে:

var up : Vector3 = transform.position - planet.position;
transform.rotation = Quaternion.FromToRotation(transform.up, up) * transform.rotation;

প্রতিটি আপডেটকে কল করুন এবং আপনার এটি কাজ করা উচিত। (নোটটি ইউনিটিস্ক্রিপ্টে রয়েছে তা নোট করুন )। সি # তে
একই কোড :

Vector3 up = transform.position - planet.position;
transform.rotation = Quaternion.FromToRotation(transform.up, up) * transform.rotation;

মাধ্যাকর্ষণ

মহাকর্ষের জন্য, আপনি আমার "গ্রহ পদার্থবিজ্ঞান কৌশল" ব্যবহার করতে পারেন, যা আমি আমার প্রশ্নে বর্ণনা করেছি, তবে এটি সত্যিই অনুকূলিত নয়। এটি আমার মনে যে কিছু ছিল।
আমি আপনাকে মাধ্যাকর্ষণটির জন্য আপনার নিজস্ব সিস্টেম তৈরি করার পরামর্শ দিচ্ছি।

এখানে সেবাস্তিয়ান লেগের একটি ইউটিউব টিউটোরিয়াল । এটি একটি খুব ভাল কাজ সমাধান।

সম্পাদনা: unity ক্যে , সম্পাদনা > প্রকল্প সেটিংস > পদার্থবিজ্ঞানে যান এবং গ্র্যাভিটির জন্য সমস্ত মান 0 তে নির্ধারণ করুন (বা সমস্ত বস্তু থেকে রিগিবিডিকে অপসারণ ), যাতে অন্তর্নির্মিত মাধ্যাকর্ষণ (যা খেলোয়াড়কে কেবল টানতে পারে) এর সাথে দ্বন্দ্ব বোধ করতে পারে কাস্টম সমাধান। (বন্ধ কর)


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

আপনি একটি ঘনক্ষেত্র তৈরি করতে পারেন যা এক্স-অক্ষের চারপাশে সীমাবদ্ধ যেমন উদাহরণস্বরূপ, অ-গোলাকার বস্তুর অভ্যন্তরে এবং প্লেয়ারটি চলার সময় এটিকে সরিয়ে দেয়, যাতে এটি সর্বদা প্লেয়ারের নীচে থাকে এবং তারপরে প্লেয়ারটিকে টানতে পারে নিচে কিউব। চেষ্টা করে দেখুন
ড্যানিয়েল কেভিস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.