【问题标题】:How to keep player on the track in unity?如何让玩家在赛道上团结一致?
【发布时间】:2021-01-21 11:47:00
【问题描述】:

我正在尝试创建一个 Endless runner 游戏。我的目标是让玩家在几乎没有弯道的情况下通过道路。所以我创建了一个带有弯曲的瓷砖,然后当我将它附加到场景播放器时不会弯曲。在笔直的道路上,他工作得很好,所有的动作都在工作。但在弯道他不转弯,只直进。即使在弯道中,如何让玩家保持在路上??? (我的播放器自动移动,用户只控制方向;左或右;想想地铁冲浪者)。我在这里附上了我的瓷砖和游戏的示例屏幕截图。example screenshot of the game playCreated 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);
    }
}

【问题讨论】:

  • 我们不知道您的代码。有很多方法可以做到这一点。您的代码如何处理运行。你是如何在你的系统中实现瓦片的。向我们提供有关您项目的一些信息,以便我们为您提供帮助。
  • 如果可以请检查一下

标签: c# unity3d game-development


【解决方案1】:

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

【讨论】:

  • 是的,球员的动作完美无缺。但问题是,当他弯腰时,他并没有转身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多