एक एनपीसी बनाएं जो प्लेयर इन यूनिटी का अनुसरण करे

गैर-खिलाड़ी वर्ण या NPCs ​​वे वर्ण हैं जो किसी मानव खिलाड़ी द्वारा नियंत्रित नहीं होते हैं और इसके बजाय स्क्रिप्ट या AI द्वारा नियंत्रित होते हैं।

सबसे आम कार्य जो एनपीसी को करना होता है, वह है प्लेयर का पीछा करना या उसका पीछा करना।

इस ट्यूटोरियल में, मैं दिखाऊंगा कि एक एनपीसी कैसे बनाया जाए जो Unity में प्लेयर का अनुसरण करता हो।

चरण 1: प्लेयर कंट्रोलर बनाएं

हम एक साधारण प्लेयर कंट्रोलर बनाएंगे, ताकि हम घूम सकें और एनपीसी का परीक्षण कर सकें:

  • एक नया गेमऑब्जेक्ट ('गेमऑब्जेक्ट' -> 'Create Empty') बनाएं और इसे नाम दें "Player"
  • एक नया कैप्सूल बनाएं ('गेमऑब्जेक्ट' -> '3D Object' -> 'Capsule'), इसे प्लेयर ऑब्जेक्ट के अंदर ले जाएं, और इसकी स्थिति को (0, 1, 0) में बदलें
  • कैप्सूल से कैप्सूल कोलाइडर घटक निकालें
  • मुख्य कैमरे को प्लेयर ऑब्जेक्ट के अंदर ले जाएं और उसकी स्थिति को (0, 1.64, 0) में बदलें
  • एक नई स्क्रिप्ट बनाएं, इसे 'SC_CharacterController' नाम दें, फिर नीचे दिए गए कोड को इसके अंदर पेस्ट करें:

'SC_CharacterController.cs'

using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_CharacterController : MonoBehaviour
{
    public float speed = 7.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Camera playerCamera;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.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 = speed * Input.GetAxis("Vertical");
            float curSpeedY = speed * Input.GetAxis("Horizontal");
            moveDirection = (forward * curSpeedX) + (right * curSpeedY);

            if (Input.GetButton("Jump"))
            {
                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);
            playerCamera.transform.localRotation = Quaternion.Euler(rotation.x, 0, 0);
            transform.eulerAngles = new Vector2(0, rotation.y);
        }
    }
}
  • प्लेयर ऑब्जेक्ट में 'SC_CharacterController' स्क्रिप्ट संलग्न करें और प्लेयर कैमरा वेरिएबल में चाइल्ड मेन कैमरा असाइन करें
  • आप देखेंगे कि इसमें स्वचालित रूप से कैरेक्टर कंट्रोलर नामक एक अन्य घटक जुड़ गया है, जिससे इसकी केंद्र स्थिति (0, 1, 0) में बदल गई है।

चरण 2: एनपीसी बनाएं

एनपीसी बनाने के लिए, नीचे दिए गए चरणों का पालन करें:

  • एक नया गेमऑब्जेक्ट बनाएं और इसे "NPC" नाम दें
  • एक नया कैप्सूल बनाएं, इसे एनपीसी ऑब्जेक्ट के अंदर ले जाएं, और इसकी स्थिति को (0, 1, 0) में बदलें
  • एक नई सामग्री बनाएं और उसे नाम दें "npc_material"
  • npc_material का रंग बदलकर लाल करें
  • एनपीसी ऑब्जेक्ट के अंदर कैप्सूल को npc_material असाइन करें (यह सिर्फ इसलिए है ताकि हम एनपीसी को प्लेयर से अलग कर सकें)

जारी रखने से पहले, हमें अपने सीन में NavMesh को बेक करना होगा।

NavMesh का अर्थ "Navigation Mesh" है और इसका उपयोग एनपीसी को बाधाओं से टकराए बिना स्तर को नेविगेट करने की अनुमति देने के लिए पाथफाइंडिंग में किया जाता है।

नवमेश को बेक करने के लिए, नीचे दिए गए चरणों का पालन करें:

  • दृश्य में प्रत्येक स्थिर वस्तु को नेविगेशन स्टेटिक के रूप में चिह्नित करें

  • नेविगेशन विंडो ('विंडो' -> 'AI' -> 'Navigation') पर जाएं, बेक टैब चुनें और फिर बेक पर क्लिक करें

NavMesh बेक होने के बाद, इसे कुछ इस तरह दिखना चाहिए:

यूनिटी 3डी नवमेश बेक

अब हम एनपीसी आंदोलन की प्रोग्रामिंग की ओर बढ़ सकते हैं:

  • 'NavMesh Agent' घटक को NPC ऑब्जेक्ट से जोड़ें
  • एक नई स्क्रिप्ट बनाएं और उसे नाम दें 'SC_NPCFollow'
  • एनपीसी ऑब्जेक्ट में 'SC_NPCFollow' स्क्रिप्ट संलग्न करें
  • 'SC_NPCFollow' स्क्रिप्ट खोलें

सबसे पहले, हम स्क्रिप्ट की शुरुआत में UnityEngine.AI नेमस्पेस जोड़कर शुरुआत करते हैं:

using UnityEngine.AI;

फिर हम आवश्यक चर परिभाषित करते हैं:

    //Transform that NPC has to follow
    public Transform transformToFollow;
    //NavMesh Agent variable
    NavMeshAgent agent;

'void Start()' में हम NavMesh एजेंट घटक को इस ऑब्जेक्ट से जोड़कर शुरू करते हैं:

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

अंत में, 'void Update()' में हम NavMesh एजेंट को प्लेयर का अनुसरण करने का निर्देश देते हैं:

    // Update is called once per frame
    void Update()
    {
        //Follow the player
        agent.destination = transformToFollow.position;
    }

यहाँ अंतिम 'SC_NPCFollow.cs' स्क्रिप्ट है:

using UnityEngine;
using UnityEngine.AI;

public class SC_NPCFollow : MonoBehaviour
{
    //Transform that NPC has to follow
    public Transform transformToFollow;
    //NavMesh Agent variable
    NavMeshAgent agent;

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        //Follow the player
        agent.destination = transformToFollow.position;
    }
}

कुछ मुद्दों को ठीक करना:

अंक 1: प्ले दबाने के बाद, एनपीसी कैप्सूल जमीन के ऊपर मंडराता है:

समाधान: NavMesh एजेंट में बेस ऑफसेट वैरिएबल को नकारात्मक मान में बदलें (मेरे मामले में यह -0.08 है)

अंक 2: प्लेयर का अनुसरण करते समय एनपीसी बहुत करीब आ जाता है:

समाधान: NavMesh एजेंट में स्टॉपिंग डिस्टेंस को उच्च मान में बदलें (मेरे मामले में मैंने इसे 5 पर सेट किया है)

एनपीसी अब तैयार है, आइए इसका परीक्षण करें:

Sharp Coder वीडियो प्लेयर

सब कुछ अपेक्षा के अनुरूप काम करता है, एनपीसी अब प्लेयर का अनुसरण करता है और एक निर्धारित दूरी पर रुक जाता है।

सुझाए गए लेख
एकता में शत्रु के एआई को लागू करना
यूनिटी में एआई सपोर्ट के साथ एफपीएस कैसे बनाएं
यूनिटी में NavMeshAgent के साथ काम करना
एकता में हिरण का एआई कैसे बनाएं
यूनिटी एसेट स्टोर पैकेज की समीक्षा - ज़ोंबी एआई सिस्टम
एकता 2डी प्लेटफ़ॉर्मर में दुश्मनों को जोड़ें
यूनिटी में टॉप-डाउन शूटर गेम का निर्माण