2016-06-06 5 views
0

В настоящее время я работаю над платформерной игрой в Unity3D, которая будет проходить в трехмерной среде с двумерными элементами управления (слева, справа, прыгать).XY Path Locked Controllable Character

У меня есть поиск в Интернете и пробовал несколько различных методов, таких как iTween, но не был удовлетворен этим.

То, что я пытаюсь создать, - это искривленный путь/плоскость, на которой позиции игрока X и Y будут заблокированы на пути. Игрок мог бы ходить туда и обратно по пути, как и любой другой платформер, сплайн позволил бы мне лучше использовать 3D-среду и продемонстрировать погружающийся мир под разными углами. Тем не менее, ось Z будет бесплатной, позволяя игроку идти как можно выше или ниже, как хотелось бы.

Я не совсем уверен, как действовать дальше, и мне было интересно, есть ли у вас, ребята, какие-либо советы или идеи о том, как это сделать.

Спасибо, Septos

+0

Пожалуйста, покажите ваши текущие попытки решения этого себе – thesecretmaster

+0

Извините за поздний ответ, здесь это код, который я привел до сих пор: – Septos

ответ

0

Извините за поздний ответ, вот код, который я до сих пор:

using UnityEngine; 
using System.Collections; 

public class CharacterPathController : MonoBehaviour 
{ 
    enum Direction {Forward, Backward}; 
    Direction charDirection; 

    public PathEditor pathToFollow; 

    private Vector3 lastPos; 
    private Vector3 charRotation; 
    private Vector3 direction; 

    public string pathName; 
    public int currentWayPointID = 0; 
    public float speed; 
    public float rotationSpeed = 7f; 

    private float reachDistance = 1.0f; 
    private float distanceX; 
    private float distanceZ; 

    void Start() 
    { 
     //pathToFollow = GameObject.Find(pathName).GetComponent<PathEditor>(); 
     lastPos = transform.position; 
    } 

    void Update() 
    { 
     Movement(); 
    } 

    void Movement() 
    { 
     if(Input.GetKey(KeyCode.RightArrow)) 
     { 
      charDirection = Direction.Forward; 

      //Calculates distance between target x and z position and object's 
      if(pathToFollow.pathObj[currentWayPointID].position.x > transform.position.x) 
       distanceX = pathToFollow.pathObj[currentWayPointID].position.x - transform.position.x; 
      else 
       distanceX = transform.position.x - pathToFollow.pathObj[currentWayPointID].position.x; 

      if(pathToFollow.pathObj[currentWayPointID].position.z > transform.position.z) 
       distanceZ = pathToFollow.pathObj[currentWayPointID].position.z - transform.position.z; 
      else 
       distanceZ = transform.position.z - pathToFollow.pathObj[currentWayPointID].position.z; 

      //Lerps object's x and z to target's 
      lastPos.x = Mathf.Lerp(transform.position.x, pathToFollow.pathObj[currentWayPointID].position.x, Time.deltaTime * speed); 
      lastPos.z = Mathf.Lerp(transform.position.z, pathToFollow.pathObj[currentWayPointID].position.z, Time.deltaTime * speed); 
      transform.position = new Vector3(lastPos.x, 0, lastPos.z); 

      //Get target's position and rotates on y-axis 
      Vector3 targetPosition = new Vector3(pathToFollow.pathObj[currentWayPointID].position.x, 
               this.transform.position.y, 
               pathToFollow.pathObj[currentWayPointID].position.z); 
      this.transform.LookAt(targetPosition); 

      if(distanceX <= reachDistance && distanceZ <= reachDistance) 
       currentWayPointID++; 
     } 
     else if(Input.GetKey(KeyCode.LeftArrow)) 
     { 
      charDirection = Direction.Backward; 

      //Calculates distance between target x and z position and object's 
      if(pathToFollow.pathObj[currentWayPointID - 1].position.x > transform.position.x) 
       distanceX = pathToFollow.pathObj[currentWayPointID - 1].position.x - transform.position.x; 
      else 
       distanceX = transform.position.x - pathToFollow.pathObj[currentWayPointID - 1].position.x; 

      if(pathToFollow.pathObj[currentWayPointID - 1].position.z > transform.position.z) 
       distanceZ = pathToFollow.pathObj[currentWayPointID - 1].position.z - transform.position.z; 
      else 
       distanceZ = transform.position.z - pathToFollow.pathObj[currentWayPointID - 1].position.z; 

      //Lerps object's x and z to target's 
      lastPos.x = Mathf.Lerp(transform.position.x, pathToFollow.pathObj[currentWayPointID - 1].position.x, Time.deltaTime * speed); 
      lastPos.z = Mathf.Lerp(transform.position.z, pathToFollow.pathObj[currentWayPointID - 1].position.z, Time.deltaTime * speed); 
      transform.position = new Vector3(lastPos.x, 0, lastPos.z); 

      //Get target's position and rotates on y-axis 
      Vector3 targetPosition = new Vector3(pathToFollow.pathObj[currentWayPointID - 1].position.x, 
               this.transform.position.y, 
               pathToFollow.pathObj[currentWayPointID - 1].position.z); 
      this.transform.LookAt(targetPosition); 

      if(distanceX <= reachDistance && distanceZ <= reachDistance) 
       currentWayPointID--; 
     } 

     if(currentWayPointID >= pathToFollow.pathObj.Count) 
     { 
      //Put code to finish the level 
      currentWayPointID = 6; 
     } 
     else if(currentWayPointID < 0) 
      currentWayPointID = 0; 
    } 
}