উত্তরটি সহজ করার জন্য, নামস্থান দ্বারা সরবরাহিত Vector3
একটি কাস্টম । আমরা যখন কাস্টম তৈরি বা ধরনের, আমরা আবশ্যক এছাড়াও তার সংজ্ঞায়িত অপারেটার । এই হিসাবে, অপারেটরের জন্য কোনও ডিফল্ট যুক্তি নেই । হিসাবে দ্বারা নির্দিষ্ট Evgeny Vasilyev , জ্ঞান করে তোলে, আমরা সরাসরি পরীক্ষা করতে পারবেন যেমন , এবং মান। একটি তিনটি পৃথক মান দ্বারা প্রতিনিধিত্ব করা হয় যে কারণে, ততটা অর্থবোধ করে না ।struct
UnityEngine
class
struct
>=
_rect_tfm.position == _positionB
Vector3.x
Vector3.y
Vector3.z
_rect_tfm.position >= _positionB
Vector3
তত্ত্বেরVector3
উপযুক্ত অপারেটরগুলি রাখতে আমরা ক্লাসটি ওভারলোড করতে পারি , তবে এটি জটিল বলে মনে হচ্ছে। পরিবর্তে, এটা সহজ হবে কেবল যাবে প্রসারিত উপযুক্ত সঙ্গে বর্গ পদ্ধতি । বলা হচ্ছে, মনে হচ্ছে আপনার এই যুক্তিটি চলাচলের জন্য ব্যবহার করার ইচ্ছা রয়েছে। এই হিসাবে, আপনি পদ্ধতিটি ব্যবহার করা আরও সহজ মনে করতে পারেন ; যদি তা হয় তবে নীচে আরও পড়ুন।Vector3
Vector3.Lerp
এতে এক্সটেনশন পদ্ধতি যুক্ত করা হচ্ছে Vector3
পূর্বে উল্লিখিত হিসাবে, প্রয়োগ <=
বা >=
একটি Vector3
প্রায়শই অযৌক্তিক হয়। চলাচলের জন্য, আপনি সম্ভবত Vector3.Lerp
পদ্ধতিটির জন্য আরও পড়তে চান । এটি বলেছিল, আপনি <=
=>
অন্যান্য কারণে পাটিগণিত প্রয়োগ করতে চাইতে পারেন , তাই আমি আপনাকে একটি সহজ বিকল্প দেব।
পরিবর্তে যুক্তি প্রয়োগের Vector3 <= Vector3
বা Vector3 >= Vector3
, আমি ব্যাপ্ত প্রস্তাব Vector3
জন্য পদ্ধতি অন্তর্ভুক্ত করা বর্গ isGreaterOrEqual(Vector3 other)
এবং isLesserOrEqual(Vector3)
। আমরা পারি এক্সটেনশন মেথড যোগ একটি থেকে struct
বা class
তাদের মধ্যে ঘোষণা করে static
বর্গ যে উত্তরাধিকারী নেই। আমরা কীওয়ার্ডটি ব্যবহার করে লক্ষ্যটিকে class
বা struct
প্রথম পরামিতি হিসাবে অন্তর্ভুক্ত করি this
। নোট আমার উদাহরণে, আমি অনুমান যে আপনি তা নিশ্চিত করার জন্য সব তিনটি প্রধান মান (অর্থ x
, y
এবং z
) হয় সব যথাক্রমে বড় বা সমান, বা ক্ষুদ্রতর বা সমান। আপনার প্রয়োজন অনুসারে আপনি এখানে নিজের যুক্তি সরবরাহ করতে পারেন।
public static class ExtendingVector3
{
public static bool IsGreaterOrEqual(this Vector3 local, Vector3 other)
{
if(local.x >= other.x && local.y >= other.y && local.z >= other.z)
{
return true;
}
else
{
return false;
}
}
public static bool IsLesserOrEqual(this Vector3 local, Vector3 other)
{
if(local.x <= other.x && local.y <= other.y && local.z <= other.z)
{
return true;
}
else
{
return false;
}
}
}
আমরা Vector3
ক্লাস থেকে এই পদ্ধতিগুলি কল করার চেষ্টা করার সময়, আমরা যে পদ্ধতিটি থেকে কল করছি local
তার প্রতিনিধিত্ব করবে Vector3
। আপনি নোট করবেন যে পদ্ধতিগুলি static
; এক্সটেনশন পদ্ধতিগুলি অবশ্যই হওয়া উচিতstatic
, তবে আপনাকে এখনও তাদের উদাহরণ থেকে কল করতে হবে। উপরের এক্সটেনশন পদ্ধতিগুলি দেওয়া, আপনি এখন এগুলি সরাসরি আপনার Vector3
প্রকারে প্রয়োগ করতে পারেন ।
Vector3 left;
Vector3 right;
// Is left >= right?
bool isGreaterOrEqual = left.IsGreaterOrEqual(right);
// Is left <= right?
bool isLesserOrEqual = left.IsLesserOrEqual(right);
Vector3
সঙ্গে চলন্তVector3.Lerp
কলিং পদ্ধতি আমাদের দুজনের মধ্যে সঠিক অবস্থান নির্ধারণ করতে পারবেন একটি নির্দিষ্ট সময়ে মান। এই পদ্ধতিটির একটা অতিরিক্ত লাভ করে তার লক্ষ্য লক্ষ্য অতিক্রম করা হবে না । তিনটি পরামিতি লাগে; শুরুর অবস্থান, শেষের অবস্থান এবং বর্তমান অবস্থান 0 এবং 1 এর মধ্যে একটি মান হিসাবে প্রতিনিধিত্ব করে It এটি ফলাফল হিসাবে একটি হিসাবে আউটপুট দেয় , যা আমরা সরাসরি বর্তমান অবস্থান হিসাবে সেট করতে পারি।Vector3.Lerp
Vector3
Vector3
Vector3.Lerp
Vector3
আপনার সমস্যা সমাধান করে, আমি এ- Vector3.Lerp
তে সরানোর জন্য প্রস্তাব দিই targetPosition
। Move
প্রতিটিটিতে পদ্ধতিটি কল করার পরে Update
, আমরা লক্ষ্যমাত্রায় পৌঁছেছি কিনা তা পরীক্ষা করতে পারি; ওভারশুট Lerp.Vector3
করবে না , তাই transform.position == targetPosition
নির্ভরযোগ্য হয়ে ওঠে। আমরা এখন অবস্থানটি যাচাই করতে পারি এবং ততক্ষণে আন্দোলনটি পরিবর্তন targetPosition
করতে leftPosition
বা পরিবর্তন করতে পারি rightPosition
।
public Vector3 leftPosition, rightPosition;
public float speed;
public Vector3 targetPosition;
private void Awake()
{
targetPosition = rightPosition;
}
private void Update()
{
Move();
if(transform.position == targetPosition)
{
// We have arrived at our intended position. Move towards the other position.
if(targetPosition == rightPosition)
{
// We were moving to the right; time to move to the left.
targetPosition = leftPosition;
}
else
{
// We were moving to the left; time to move to the right.
targetPosition = rightPosition;
}
}
}
private void Move()
{
// First, we need to find out the total distance we intend to move.
float distance = Vector3.Distance(transform.position, targetPosition);
// Next, we need to find out how far we intend to move.
float movement = speed * Time.deltaTime;
// We find the increment by simply dividing movement by distance.
// This will give us a decimal value. If the decimal is greater than
// 1, we are moving more than the remaining distance. Lerp
// caps this number at 1, which in turn, returns the end position.
float increment = movement / distance;
// Lerp gives us the absolute position, so we pass it straight into our transform.
transform.position = Vector3.Lerp(transform.position, targetPosition, increment);
}
আপনি নিম্নলিখিত অ্যানিমেশন এ প্রদর্শিত হতে পারে। আমি এর সাথে নীল ঘনকটি অনুবাদ করি Vector3.LerpUnclamped
, যা আমাদের সরল অনিচ্ছুক অনুবাদটির অনুরূপ ফলাফল দেয়। আমি লাল কিউব ব্যবহার করে অনুবাদ করি Vector3.Lerp
। বাম যাচাই না করা, নীল ঘনকটি বিস্মৃতিতে চলে যায়; যখন লাল ঘনক্ষেত্রটি ঠিক যেখানে থামাতে চাইছে সেখানেই থামছে। স্ট্যাক ওভারফ্লো ডকুমেন্টেশনে আপনি এই ধরণের গতিবিধি সম্পর্কে আরও পড়তে পারেন ।
Bools
পছন্দ_atPosA
এবং এড়ানো উচিত_atPosB
। অনিবার্যভাবে, আপনি তাদের উভয়কে সিঙ্কে রেখে ভুল করবেন এবং এটি বাগের দিকে নিয়ে যাবে। এটি একটি করতে ভালোenum
সব অবস্থানের (এ, বি, সম্ভবত ভবিষ্যতে অন্যদের) ধারণকারী, এবং যে ব্যবহার