আমি আমার যা প্রয়োজন প্রয়োজন তা সম্পাদন করতে সক্ষম হয়েছি, প্রাথমিকভাবে ধাঁধাটির ধরণের পৃষ্ঠের জন্য এই ব্লগ পোস্টটির সহায়তায় এবং প্লেয়ারের গতিবিধি এবং ক্যামেরার জন্য আমার নিজস্ব ধারণাগুলি নিয়ে এসেছি।
খেলোয়াড়কে কোনও বস্তুর সারফেসে স্নেপিং করা
বেসিক সেটআপটিতে একটি বৃহত গোলক (বিশ্ব) এবং একটি ছোট গোলক (প্লেয়ার) উভয়ই থাকে যার সাথে গোলকের সাথে সংযুক্ত থাকে 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);
}
আরও আকর্ষণীয় ক্যামেরা বাস্তবায়নের জন্য তবে নিয়ন্ত্রণগুলি আমাদের এখানে যেমন রয়েছে তেমনই হতে পারে আপনি সহজেই এমন একটি ক্যামেরা প্রয়োগ করতে পারেন যা রেন্ডার হয় না বা কেবলমাত্র একটি ডামি অবজেক্টকে বেভাল মুভমেন্ট বন্ধ করে দেয় এবং তারপরে রেন্ডার করতে আরও আকর্ষণীয় ক্যামেরা ব্যবহার করতে পারে আপনি খেলাটি দেখতে চান। নিয়ন্ত্রণগুলি ভঙ্গ না করে আপনি অবজেক্টগুলির আশেপাশে যাওয়ার সাথে সাথে এটি দুর্দান্ত ক্যামেরা স্থানান্তরের অনুমতি দেবে।