问题描述
我正在尝试创建 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);
}
}
解决方法
玩家能控制自己的移动吗? (还不能发表评论)