如何让玩家团结在赛道上?

时间:2021-01-21 11:47:00

标签: c# unity3d game-development

我正在尝试创建 Endless runner 游戏。我的目标是让玩家在几乎没有弯道的情况下通过道路。所以我创建了一个带有弯曲的瓷砖,然后当我将它附加到场景播放器时不会弯曲。在笔直的路上,他工作得很好,所有的动作都在起作用。但在弯道他不转弯,只直行。如何让玩家即使在弯道上也能上路??? (我的播放器自动移动,用户只控制方向;向左或向右;想想地铁冲浪者)。我在此处附上了我的磁贴和游戏的示例屏幕截图。example screenshot of the game play Created Tile with the bend

这是我的播放器控制器代码。

using System.Collections;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private CharacterController controller;
    private Vector3 direction;
    public float forwardSpeed;
    public float maxSpeed;

    private int desiredLane = 1;//0:left, 1:middle, 2:right
    public float laneDistance = 2.5f;//The distance between tow lanes

    public bool isGrounded;
    public LayerMask groundLayer;
    public Transform groundCheck;

    public float jumpForce;
    public float Gravity = -20;

    public Animator[] animator;
    private bool isSliding = false;
    private int Index=0;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        
    }

    void Update()
    {
        if (!PlayerManager.isGameStarted)
            return;

        //Increase Speed 
        if(forwardSpeed < maxSpeed)
            forwardSpeed += 0.1f * Time.deltaTime;


        animator[Index].SetBool("isGameStarted", true);
        direction.z = forwardSpeed;

        Debug.Log("this is animator" + Index);

        isGrounded = Physics.CheckSphere(groundCheck.position, 0.15f, groundLayer);
        animator[Index].SetBool("isGrounded", isGrounded);
        if (isGrounded)
        {
            if (SwipeManager.swipeUp)
                Jump();

            if (SwipeManager.swipeDown && !isSliding)
                StartCoroutine(Slide());
        }
        else 
        {
            direction.y += Gravity * Time.deltaTime;
            if (SwipeManager.swipeDown && !isSliding)
            {
                StartCoroutine(Slide());
                direction.y = -8;
            }
                

        }

        //Gather the inputs on which lane we should be
        if (SwipeManager.swipeRight)
        {
            animator[Index].SetTrigger("right");
            desiredLane++;
            if (desiredLane == 3)
                desiredLane = 2;
        }
        if (SwipeManager.swipeLeft)
        {
            animator[Index].SetTrigger("left");

            desiredLane--;
            if (desiredLane == -1)
                desiredLane = 0;
        }

        //Calculate where we should be in the future
        Vector3 targetPosition = transform.position.z * transform.forward + transform.position.y * transform.up;
        if (desiredLane == 0)
            targetPosition += Vector3.left * laneDistance;
        else if (desiredLane == 2)
            targetPosition += Vector3.right * laneDistance;


        //transform.position = targetPosition;
        if (transform.position != targetPosition)
        {
            Vector3 diff = targetPosition - transform.position;
            Vector3 moveDir = diff.normalized * 25 * Time.deltaTime;
            if (moveDir.sqrMagnitude < diff.magnitude)
                controller.Move(moveDir);
            else
                controller.Move(diff);
        }

        //Move Player
        controller.Move(direction * Time.deltaTime);


    }

    private void Jump()
    {
        Debug.Log(jumpForce.ToString());
        direction.y = jumpForce;
    }

    private void OnControllerColliderHit(ControllerColliderHit hit)
    {
        if(hit.transform.tag == "Obstacle")
        {
            PlayerManager.gameOver = true;
            FindObjectOfType<AudioManager>().PlaySound("GameOver");
        }
    }

    private IEnumerator Slide()
    {

        isSliding = true;
        animator[Index].SetBool("isSliding", true);
        controller.center = new Vector3(0, -0.5f, 0);
        controller.height = 1;

        yield return new WaitForSeconds(1.3f);

        controller.center = Vector3.zero;
        controller.height = 2;
        animator[Index].SetBool("isSliding", false);
        isSliding = false;
    }
}

这是我的磁贴管理器代码

using System.Collections.Generic;
using UnityEngine;

public class TileManager : MonoBehaviour
{
    public GameObject[] tilePrefabs;
    public float zSpawn = 0;
    public float tileLength = 1010;
    public int numberOfTiles = 1;
    private List<GameObject> activeTiles = new List<GameObject>();

    public Transform playerTransform;
    void Start()
    {
        for (int i = 0; i < numberOfTiles; i++)
        {
            if(i==0)
                SpawnTile(0);
            else
                SpawnTile(Random.Range(0, tilePrefabs.Length));
        }
            
    }
    void Update()
    {
        if(playerTransform.position.z - 1010 > zSpawn -(numberOfTiles * tileLength))
        {
            SpawnTile(Random.Range(0, tilePrefabs.Length));
            DeleteTile();
        }
            
    }
    public void SpawnTile(int tileIndex)
    {

        GameObject go = Instantiate(tilePrefabs[tileIndex], transform.forward * zSpawn, transform.rotation);
        activeTiles.Add(go);
        zSpawn += tileLength;
    }

    private void DeleteTile()
    {
        Destroy(activeTiles[0]);
        activeTiles.RemoveAt(0);
    }
}

1 个答案:

答案 0 :(得分:0)

玩家能控制自己的移动吗? (还不能发表评论)