मैं इस बात को पूरा करने में कामयाब रहा कि मुझे क्या चाहिए, मुख्य रूप से इस ब्लॉग पोस्ट की सहायता से सतह के टुकड़े के टुकड़े के लिए और खिलाड़ी के आंदोलन और कैमरे के लिए अपने स्वयं के विचारों के साथ आया।
एक वस्तु की सतह के लिए तड़क खिलाड़ी
मूल सेटअप में एक बड़ा गोला (दुनिया) और एक छोटा गोला (खिलाड़ी) होता है, जिसमें दोनों गोलक होते हैं जो उनसे जुड़े होते हैं।
जो काम किया जा रहा है वह निम्नलिखित दो विधियों में था:
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
पैरामीटर बस के रूप में यह लग रहा है, दिशा हम करते समय इस उदाहरण में अपेक्षाकृत सरल समाप्त हो गया इस फ्रेम में हमारे खिलाड़ी ले जाया जा रहा है, और है कि वेक्टर गणना करते समय, जा रहे हैं, मुझे पहली बार में यह पता लगाने के लिए एक सा मुश्किल था। उस पर और बाद में, लेकिन बस ध्यान रखें कि यह उस दिशा में एक सामान्यीकृत वेक्टर है जो खिलाड़ी इस फ्रेम को आगे बढ़ा रहा है।
के माध्यम से कदम रखते हुए, पहली चीज जो हम जांचते हैं कि क्या एक किरण, काल्पनिक भविष्य की स्थिति में उत्पन्न होती है, जो नीचे वेक्टर (-transform.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);
}
अंत में, खिलाड़ी को स्थानांतरित करने के लिए, हमने मुख्य कैमरे के रूपांतरण का लाभ उठाया ताकि हमारे नियंत्रण के साथ ऊपर, नीचे की ओर नीचे बढ़ें, आदि और यह यहाँ है कि हम UpdatePlayerTransform कहते हैं, जो हमारी स्थिति को विश्व ऑब्जेक्ट में तड़क जाएगा।
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);
}
एक और दिलचस्प कैमरा लागू करने के लिए, लेकिन हमारे यहां जो है उसके बारे में नियंत्रण उसी तरह से हो सकता है, जिसे आप आसानी से एक कैमरा लागू कर सकते हैं, जो बंद मूवमेंट करने के लिए या किसी अन्य डमी ऑब्जेक्ट को लागू नहीं करता है और फिर क्या प्रस्तुत करने के लिए अधिक दिलचस्प कैमरा का उपयोग करें आप खेल की तरह दिखना चाहते हैं। यह अच्छा कैमरा संक्रमण की अनुमति देगा क्योंकि आप नियंत्रणों को तोड़ने के बिना वस्तुओं के चारों ओर जाते हैं।