我正在尝试创建 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);
}
}
答案 0 :(得分:0)
玩家能控制自己的移动吗? (还不能发表评论)