Yablu
Yablu

Reputation: 21

Player unable to move after being teleported/transported Unity3d

I've been trying to fix this one bug in my code for over 7 hours now, upon being teleported, the movement controls cease to function, the mouse works fine, you can look around, but you can't move around.

I wanted to set up some simple code that would teleport the player to a "checkpoint" upon achieving a negative or null y level. I was doing this for a parkour based game, if the player fell off the platform they would have to start over, but after teleporting, it becomes impossible to move as I'm sure I have already said. My code is pretty simple:

public class Main : MonoBehaviour
{
    float Fall;

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 Checkpoint = new Vector3 (0,3,0);
        GameObject Player = GameObject.FindGameObjectWithTag("Player");
        Fall = GameObject.FindGameObjectWithTag("Player").transform.position.y;
        if (Fall<-4) 
        {
            Player.transform.position = Checkpoint;
        }
    }
}

You would think that this would just simply change the coordinates of the player, but I think this might be screwing with the FPSController script. I am using Unity3d, with Standard Assets imported, All of the code is in C#.

Upvotes: 1

Views: 253

Answers (1)

TEEBQNE
TEEBQNE

Reputation: 6266

Instead of checking the Y value of your character, I would instead place a death collider under the map. Make this a trigger and if the player touches this trigger, then teleport them back. Nothing with your code should screw with the FPS controller so it might be something else. I would also highly recommend not using a FindGameObjectWithTag in the Update() method as it is extremely expensive to use this every frame, especially twice. If you would rather keep the Update() Y component of the position check, please rewrite the code to something like this:

public class Main : MonoBehaviour
{
    // assign this object of your player in the inspector - it stores the reference to reuse
    // instead of grabbing it every frame
    [SerializeField] private Transform playerTransform = null;
    
    // make this a variable as it is not changing - might as well make this const too
    private Vector3 checkpoint = new Vector3(0, 3, 0);
    
    // constant value of what to check for in the Y
    private const int FALL_Y_MARKER = -4;
    
    // Update is called once per frame
    void Update()
    {
        if (playerTransform.position.y < FALL_Y_MARKER) 
        {
            playerTransform.position = checkpoint;
        }
    }
}

With your current code, there should be nothing breaking your input/movement, but with that said, we can not see your input/movement code. All the above snippet does is check if the Y component of the player objects position is below a certain value, and if it is, it sets the position to a new vector. Can you post a bit more movement code or somewhere else it can go wrong that you think is the issue?

Upvotes: 1

Related Questions