Search code examples
c#unity-game-engine2d-gamesrigid-bodiestopdown

I'm trying to make as so, on trigger, the player stops moving


I'm developing a TopDown 2D game in Unity. The idea is, when the player steps on a certain tile, a UI with text pops up (already working) and the player stops moving until the player clicks a button (already programmed and working) and the UI disappears. I was advised to turn the RigidBody2D to kinematic however it doesn't work and it just does what it used to do. Am I doing something wrong? Here is the code for the trigger script on the tiles:

public class TriggerScript : MonoBehaviour
{
    public string popUp;
    public void Start()
    {
 
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        Rigidbody2D Player = GameObject.Find("Player").GetComponent<Rigidbody2D>();
        PopUpSystem pop = GameObject.FindGameObjectWithTag("GameManager").GetComponent<PopUpSystem>();
        if (collision.gameObject.tag == "Player")
        {
            pop.PopUp(popUp);
            Player.GetComponent<Rigidbody2D>().bodyType = RigidbodyType2D.Kinematic;
        }

    }
    private void OnTriggerExit2D(Collider2D collision)
    {
        Rigidbody2D Player = GameObject.Find("Player").GetComponent<Rigidbody2D>();
        PopUpSystem pop = GameObject.FindGameObjectWithTag("GameManager").GetComponent<PopUpSystem>();
        pop.closeBox();
        Player.GetComponent<Rigidbody2D>().bodyType = RigidbodyType2D.Dynamic;
    }
}

Solution

  • PopUpSystem.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using TMPro;
    
    public class PopUpSystem : MonoBehaviour
    {
        public GameObject popUpBox;
        public Animator popupanimation;
        public TMP_Text popUpText;
        public PLayerController mb;
        public void PopUp(string text)
        {                
            popUpBox.SetActive(true);
            popUpText.text = text;
            popupanimation.SetTrigger("pop");         
        }
    
        public void closeBox()
        {
            popupanimation.SetTrigger("close");
            mb.camMove = true;
        }
    }
    

    PLayerController.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PLayerController : MonoBehaviour
    {
        private Rigidbody2D MyRB;
        private Animator myAnim;
    
        [SerializeField]
        private float speed;
        public bool camMove = true;
        // Start is called before the first frame update
        void Start()
        {
            MyRB = GetComponent<Rigidbody2D>();
            myAnim = GetComponent<Animator>();
        }
    
        // Update is called once per frame
        void Update()
        {
            if (camMove)
            {
                MyRB.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")) * speed * Time.deltaTime;
    
                myAnim.SetFloat("moveX", MyRB.velocity.x);
                myAnim.SetFloat("moveY", MyRB.velocity.y);
                if ((Input.GetAxisRaw("Horizontal") == 1) || (Input.GetAxisRaw("Horizontal") == -1) || (Input.GetAxisRaw("Vertical") == 1) || (Input.GetAxisRaw("Vertical") == -1))
                {
                    myAnim.SetFloat("LastMoveX", Input.GetAxisRaw("Horizontal"));
                    myAnim.SetFloat("LastMoveY", Input.GetAxisRaw("Vertical"));
                }
            }
    
            if (!camMove)
            {
                MyRB.velocity = new Vector2(0, 0);
            }
    
        }
        
    }
    

    TriggerScript.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TriggerScript : MonoBehaviour
    {
        public string popUp;
        Animator popAnim;
        public PLayerController mb;
    
        private void Start()
        {
            popAnim = GameObject.FindGameObjectWithTag("PopUpBox").GetComponent<Animator>();
        }
        private void OnTriggerEnter2D(Collider2D collision)
        {
            PopUpSystem pop = GameObject.FindGameObjectWithTag("GameManager").GetComponent<PopUpSystem>();
            var myp = GameObject.FindGameObjectWithTag("Player").GetComponent<PLayerController>();
            
            if (collision.gameObject.tag == "Player")
            {
                pop.PopUp(popUp);
                mb.camMove = false;
            }
    
            if (popAnim.GetCurrentAnimatorStateInfo(1).IsName("close"))
            {
                mb.camMove = true;
                Debug.Log("close");
            }
    
    
        }
        private void OnTriggerExit2D(Collider2D collision)
        {
            PopUpSystem pop = GameObject.FindGameObjectWithTag("GameManager").GetComponent<PopUpSystem>();
            pop.closeBox();
        }
    }
    

    Things to keep in mind:

    1- Make a new tag and call it PopUpBox. then assign this tag to the Trigger GameObject.

    2- To the button of the PopUpBox GameObject (the one which is disabled) assign GameManager GameObject and in its function select PopUpSystem.closeBox

    3- In both Trigger GameObject and GameManager assign Player in Mb field.

    Hope this help you. You can play with that more to get better results.