在 Keypress 上交换两个游戏对象

问题描述

当我按下 Space 时,玩家和假人应该交换位置。这不仅发生一次,每次我按空格键时都需要发生,以便他们可以来回交换。但是,有时它起作用,有时不起作用。当它不起作用时,假人会传送到玩家,然后玩家会传送到假人内部(因为那是它的最后一个位置)。这只是推动玩家。 代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerSwap : MonoBehavIoUr
{
    public GameObject player;
    public GameObject dummy;
    public GameObject cameraAnchor;

    public Transform playerLastPos;
    public Transform dummyLastPos;

    public bool haveSwapped;
    public bool canSwap;

    public float swapRadius;
    public LayerMask dummyInRadius;

    // Update is called once per frame
    void Update()
    {
        canSwap = Physics.CheckSphere(player.transform.position,swapRadius,dummyInRadius);

        SwapTransforms();

        if (canSwap)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                haveSwapped = !haveSwapped;
                Swapping();
            }
        }
        else
        {
            Debug.Log("Can't Swap");
        }
        cameraAnchor.transform.position = player.transform.position;
    }

    public void SwapTransforms()
    {
        if (haveSwapped)
        {
            dummyLastPos.position = player.transform.position;
            playerLastPos.position = dummy.transform.position;
        }
        else
        {
            dummyLastPos.position = dummy.transform.position;
            playerLastPos.position = player.transform.position;
        }
    }

    public void Swapping()
    {
        if (haveSwapped)
        {
            player.transform.position = dummyLastPos.position;
            dummy.transform.position = playerLastPos.position;
        }
        else
        {
            player.transform.position = playerLastPos.position;
            dummy.transform.position = dummyLastPos.position;
        }
    }

    public void OnDrawGizmos()
    {
        Gizmos.color = Color.white;
        Gizmos.DrawWireSphere(player.transform.position,swapRadius);
    }
}

解决方法

我已经解决了。在清理了大部分代码并实现后,我不得不关闭播放器上的移动和角色控制器(链接:Unity Answers),我想出了这个:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerSwap : MonoBehaviour
{
    public ThirdPersonMovement playerMove;

    public GameObject player;
    public GameObject dummy;
    public GameObject cameraAnchor;

    public Transform playerLastPos;
    public Transform dummyLastPos;

    public bool canSwap;

    public float swapRadius;
    public LayerMask dummyInRadius;

    // Update is called once per frame
    void Update()
    {
        canSwap = Physics.CheckSphere(player.transform.position,swapRadius,dummyInRadius);

        if (canSwap)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                playerMove.canMove = false;
                player.GetComponent<CharacterController>().enabled = false;

                SetTransforms();
            }
        }
        else
        {
            Debug.Log("Can't Swap");
        }
        cameraAnchor.transform.position = player.transform.position;
    }

    public void SetTransforms()
    {
        dummyLastPos.position = dummy.transform.position;
        playerLastPos.position = player.transform.position;
        Debug.Log("Set Transforms");

        Swapping();
    }

    public void Swapping()
    {
        player.transform.position = dummyLastPos.position;
        dummy.transform.position = playerLastPos.position;
        dummy.transform.rotation = player.transform.rotation;
        Debug.Log("Swap");

        playerMove.canMove = true;
        player.GetComponent<CharacterController>().enabled = true;
    }

    public void OnDrawGizmos()
    {
        Gizmos.color = Color.white;
        Gizmos.DrawWireSphere(player.transform.position,swapRadius);
    }
}