यूनिटी में थर्ड-पर्सन कैमरा
थर्ड-पर्सन कैमरा एक प्रकार का कैमरा है जो खिलाड़ी के पीछे रखा जाता है, आमतौर पर थोड़ा सा साइड में शिफ्ट किया जाता है, जो खेल के स्तर और खिलाड़ी का एक दृश्य प्रतिनिधित्व देता है।
Unity में थर्ड-पर्सन शूटर (TPS) कैमरा बनाने के लिए हम नियमित खिलाड़ी मूवमेंट और थर्ड-पर्सन व्यू के संयोजन का उपयोग करेंगे।
चरण 1: प्लेयर कंट्रोलर बनाएं
सबसे पहले, हम एक प्लेयर कंट्रोलर बनाएंगे जो रोटेशन और मूवमेंट को संभालेगा:
- एक नया गेम ऑब्जेक्ट बनाएं (गेम ऑब्जेक्ट -> खाली बनाएं) और इसे नाम दें "Player"
- एक नया कैप्सूल बनाएं (गेम ऑब्जेक्ट -> 3डी ऑब्जेक्ट -> कैप्सूल) और इसे "Player" ऑब्जेक्ट के अंदर ले जाएं
- कैप्सूल से कैप्सूल कोलाइडर घटक निकालें और उसकी स्थिति को (0, 1, 0) में बदलें
- एक नया गेमऑब्जेक्ट बनाएं और इसे "CameraParent" नाम दें और इसे "Player" ऑब्जेक्ट के अंदर ले जाएं, इसकी स्थिति को (0, 1.64, 0) में बदलें।
- मुख्य कैमरे को "CameraParent" ऑब्जेक्ट के अंदर ले जाएं और प्लेयर के पीछे ले जाएं (मेरे मामले में मैंने इसे इस स्थिति में ले जाया: (0.5, 0.6, -2.9))
- एक नई स्क्रिप्ट बनाएं, इसे SC_TPSController नाम दें, और नीचे दिए गए कोड को इसके अंदर पेस्ट करें:
SC_TPSController.cs
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class SC_TPSController : MonoBehaviour
{
public float speed = 7.5f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;
public Transform playerCameraParent;
public float lookSpeed = 2.0f;
public float lookXLimit = 60.0f;
CharacterController characterController;
Vector3 moveDirection = Vector3.zero;
Vector2 rotation = Vector2.zero;
[HideInInspector]
public bool canMove = true;
void Start()
{
characterController = GetComponent<CharacterController>();
rotation.y = transform.eulerAngles.y;
}
void Update()
{
if (characterController.isGrounded)
{
// We are grounded, so recalculate move direction based on axes
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 right = transform.TransformDirection(Vector3.right);
float curSpeedX = canMove ? speed * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? speed * Input.GetAxis("Horizontal") : 0;
moveDirection = (forward * curSpeedX) + (right * curSpeedY);
if (Input.GetButton("Jump") && canMove)
{
moveDirection.y = jumpSpeed;
}
}
// Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
// when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
// as an acceleration (ms^-2)
moveDirection.y -= gravity * Time.deltaTime;
// Move the controller
characterController.Move(moveDirection * Time.deltaTime);
// Player and Camera rotation
if (canMove)
{
rotation.y += Input.GetAxis("Mouse X") * lookSpeed;
rotation.x += -Input.GetAxis("Mouse Y") * lookSpeed;
rotation.x = Mathf.Clamp(rotation.x, -lookXLimit, lookXLimit);
playerCameraParent.localRotation = Quaternion.Euler(rotation.x, 0, 0);
transform.eulerAngles = new Vector2(0, rotation.y);
}
}
}
- SC_TPSController स्क्रिप्ट को "Player" ऑब्जेक्ट में संलग्न करें (आप देखेंगे कि इसमें कैरेक्टर कंट्रोलर नामक एक अन्य घटक भी जोड़ा गया है। इसके केंद्र मान को (0, 1, 0) में बदलें)
- "CameraParent" ऑब्जेक्ट को "Player Camera Parent" वेरिएबल पर असाइन करें
चरण 2: कैमरा टकराव का पता लगाने वाला उपकरण जोड़ें
कैमरा टकराव का पता लगाने में एक स्क्रिप्ट शामिल होगी जो जांच करेगी कि कैमरा और प्लेयर के बीच कुछ है या नहीं, और स्वचालित रूप से कैमरे को करीब ले जाएगा, इस प्रकार कैमरे को वस्तुओं के माध्यम से क्लिप करने से रोका जाएगा।
- एक नई स्क्रिप्ट बनाएं, इसे SC_CameraCollision नाम दें और फिर नीचे दिए गए कोड को इसके अंदर पेस्ट करें:
SC_CameraCollision.cs
using UnityEngine;
public class SC_CameraCollision : MonoBehaviour
{
public Transform referenceTransform;
public float collisionOffset = 0.3f; //To prevent Camera from clipping through Objects
public float cameraSpeed = 15f; //How fast the Camera should snap into position if there are no obstacles
Vector3 defaultPos;
Vector3 directionNormalized;
Transform parentTransform;
float defaultDistance;
// Start is called before the first frame update
void Start()
{
defaultPos = transform.localPosition;
directionNormalized = defaultPos.normalized;
parentTransform = transform.parent;
defaultDistance = Vector3.Distance(defaultPos, Vector3.zero);
//Lock cursor
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
// LateUpdate is called after Update
void LateUpdate()
{
Vector3 currentPos = defaultPos;
RaycastHit hit;
Vector3 dirTmp = parentTransform.TransformPoint(defaultPos) - referenceTransform.position;
if (Physics.SphereCast(referenceTransform.position, collisionOffset, dirTmp, out hit, defaultDistance))
{
currentPos = (directionNormalized * (hit.distance - collisionOffset));
transform.localPosition = currentPos;
}
else
{
transform.localPosition = Vector3.Lerp(transform.localPosition, currentPos, Time.deltaTime * cameraSpeed);
}
}
}
- मुख्य कैमरे में SC_CameraCollision स्क्रिप्ट संलग्न करें
- "CameraParent" ऑब्जेक्ट को "Reference Transform" वेरिएबल पर असाइन करें
- यदि कैमरा दीवारों से टकरा रहा है तो "Collision Offset" और "Camera Speed" मानों में बदलाव करें
टीपीएस कैमरा अब तैयार है, इसका परीक्षण करने के लिए प्ले दबाएं।