একাধিক কী চাপলে কীভাবে চলাচলের গতি স্ট্যাকিং এড়ানো যায়?


17

আমি একটি নতুন গেম শুরু করেছি যার কোনও মাউস লাগবে না, এভাবে কীবোর্ডটি নাড়াচাড়া করে। আমি 8 টি দিক একত্রিত করার চেষ্টা করেছি; উপরে, বাম, ডান, উপরে-ডান এবং আরও কিছু। তবে আমি যখন একাধিক তীর কী টিপব তখন চলাফেরার গতি স্ট্যাকস ( http://gfycat.com/CircularBewitchedBarebirdbat )। আমি কীভাবে এটিকে মোকাবেলা করতে পারি?

এখানে আমার কোড সম্পর্কিত অংশ:

var speed : int = 5;

function Update () {
    if (Input.GetKey(KeyCode.UpArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) {
        transform.rotation = Quaternion.AngleAxis(315, Vector3.up);
    }
    if (Input.GetKey(KeyCode.DownArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}

3
স্পর্শকাতর: আপনার কোডের ইনডেন্টেশনটি কিছুটা গোলমাল হয়েছিল তাই আমি প্রথমে লক্ষ্য করিনি, তবে আপনার কোডের শর্তগুলি এটিকে বেশিরভাগটি চালানো থেকে আটকাবে। পছন্দ করুন, যদি (আপআর্রো) হয় তবে অন্যথায় যদি (উপআড়ো && রাইটআ্রো) কখনই 'অন্য' শাখা পরিচালনা করবে না।
23:44

উত্তর:


13

আপনার দিকনির্দেশ নির্বাচন কোডটি প্রকৃত আন্দোলনের কোড থেকে আলাদা করুন।

  1. Directionকোন কী টিপছে তা পরীক্ষা করে চয়ন করুন । এটিকে ইউনিট (সাধারণীকরণ) ভেক্টর হিসাবে সংরক্ষণ করুন।
  2. আপনার Directionসাথে Speedএবং এর সাথে গুণ করুন DeltaTime
  3. আপনার অবজেক্ট / ক্যামেরায় ফলাফল রূপান্তর প্রয়োগ করুন Apply

27

আপনাকে দিকনির্দেশের যোগফল নেওয়া দরকার, এটিকে স্বাভাবিক করুন, তারপরে গতি দিয়ে গুণ করুন।

তির্যকভাবে তির্যক আন্দোলন রোধ করার বিষয়ে আমার প্রতিক্রিয়ার অংশ হিসাবে আমি এটিকে উত্তর দিয়েছি

বিশেষ করে:

velX = 0;
velY = 0;

if(keyLeft) velX += -1;
if(keyRight) velX += 1;
if(keyUp) velY += -1;
if(keyDown) velY += 1;

// Normalize to prevent high speed diagonals
length = sqrt((velX * velX ) + (velY * velY ));
if (length != 0)
{
    velX /= length;
    velY /= length;
}

velX *= speed;
velY *= speed;

3
হেইহে, ল্যারি গর্বিত হবে! c2.com/cgi/wiki?LazinessImpatienceHubris
jzx

3
নোট করুন যে ইউনিটি ইতিমধ্যে কোনও ভেক্টরের দৈর্ঘ্য এবং বর্গক্ষেত্রের আকার পাওয়ার জন্য পদ্ধতি সরবরাহ করে ।
সেলাালী অ্যাডোবরের

1
কোনও কী টিপে না থাকলে এটি NaN উত্পন্ন করে
কোডসইনচাউস

1
@ জেডএক্সএক্স, আমরা দুর্বল হোবিটসের মতো হওয়ার চেষ্টা করি to youtube.com/watch?v=G49RUPv5-NU
ফড়াপ

11

"সাধারণীকরণের দিকের ভেক্টর" হ'ল এই কাজটি সাধারণত কীভাবে করা হয় এবং আমি প্রায়শই এটি কীভাবে করি তবে ইদানীং আমি কেবল ফলাফলের আন্দোলন ভেক্টরকে ক্ল্যাম্পিং করে চলেছি। এটি সাধারণত একই শেষ ফলাফল অর্জন করে এবং কোডটি অনেক সহজ:

var moveSpeed = 6.0f;
function Update() {
  var movement = Vector3.zero;
  movement.x = Input.GetAxis("Horizontal") * moveSpeed;
  movement.z = Input.GetAxis("Vertical") * moveSpeed;
  movement = Vector3.ClampMagnitude(movement, moveSpeed);
  movement *= Time.deltaTime;
  transform.Translate(movement);
}

সহজ কোড প্রায় সর্বদা ভাল: ই


কি করে ClampMagnitude, এটি কি Normalize * Constantছদ্মবেশে একই কোড নয় ?
ক্রোমস্টার বলেছেন, মনিকাকে

2
বেশ না। "ক্ল্যাম্পিং" একটি মান নিশ্চিত করে যে এটি একটি সীমাতে / সর্বাধিকের নীচে থাকে, যখন সাধারণীকরণটি মানকে ধ্রুবক হিসাবে সেট করে। Unক্যের সাথে অন্তত, গেটএক্সিস () সামান্য ত্বরান্বিত মানগুলি ফিরিয়ে দেয়, আপনাকে একটি মসৃণ আন্দোলন দেয়। ভেক্টরকে সাধারণকরণের ফলে ত্বরণকে ওভাররাইড করা হয়, যখন ক্ল্যাম্পিংয়ের ফলে ত্বরণটি ঘটে allows এটি সূক্ষ্ম তবে সুন্দর দেখাচ্ছে। শেষের প্রভাব যদিও অনেকটা একই।
21:20

1
1ক্যের প্রসঙ্গে সরাসরি লিখিত একমাত্র উত্তর হওয়ার জন্য +1। এপিআই এই ধরণের পরিস্থিতি মাথায় রেখে সমস্ত ধরণের দরকারী ভেক্টর / কোয়ার্টারিওন গণিতের পদ্ধতি সরবরাহ করে, আপনার নিজের রোল করার কোনও কারণ নেই।
সেলাালী অ্যাডোবর

আমি 1 এ ক্ল্যাম্প করতাম এবং কেবল moveSpeedক্ল্যাম্পিংয়ের পরে গুন করতাম এবং সম্ভবত এটি দ্বারা গুণনের সাথে একীভূত হত deltaTime
কোডসইনচাউস

এই পরিবর্তনটি কেবল একটি গুণকের অপারেশন অপসারণের চেয়ে আরও কী লাভ করে? পছন্দ করুন, 1 বাতা ক্ল্যাম্পিং 6 বাছাই করা থেকে আলাদাভাবে কাজ করে? আপনার পরিবর্তনটি কী করে তা ভাবছেন ...
21:44
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.