Unity3d 设计特定的网格运动

Unity3d 设计特定的网格运动,unity3d,game-physics,2d-games,Unity3d,Game Physics,2d Games,我试图实现的是,当玩家按住鼠标键时, 在磁贴上(任何网格元素,与玩家垂直或水平对齐),玩家将朝该磁贴移动,可能的方向为左、右、上、下 目前我的代码在按下鼠标按钮时不适用,我认为这与光线投射有关 我想实现的第二件事是,当玩家在网格中移动时,如果玩家决定改变方向,他将能够改变方向,无论方向是相反的,还是他决定突然向左/向右转弯 (我在没有使用isMoving布尔条件的情况下,只在相反方向上实现了它,但我添加了它,因为当玩家在移动时单击时,它会减慢他的速度) 现在,移动时的移动没有变化 using U

我试图实现的是,当玩家按住鼠标键时,

在磁贴上(任何网格元素,与玩家垂直或水平对齐),玩家将朝该磁贴移动,可能的方向为左、右、上、下

目前我的代码在按下鼠标按钮时不适用,我认为这与光线投射有关

我想实现的第二件事是,当玩家在网格中移动时,如果玩家决定改变方向,他将能够改变方向,无论方向是相反的,还是他决定突然向左/向右转弯

(我在没有使用isMoving布尔条件的情况下,只在相反方向上实现了它,但我添加了它,因为当玩家在移动时单击时,它会减慢他的速度)

现在,移动时的移动没有变化

using UnityEngine;
using Holoville.HOTween;
using System.Collections;

public class Player : MonoBehaviour {

    public float speed = 100f;
    private Vector3 startPos;
    private Vector3 endPos;
    private float startTime;
    private float journeyLength;
    private tile currentTile;
    private tile tileToMove;
    private float angleToTurn = 0f;
    private bool isMoving = false;
    public static Player use;

    void Awake()
    {
        use = this;
    }

    void Start () {

        startPos = endPos = transform.position;
        tileToMove = currentTile = fieldGenerator.use.tilesList[0];
    }

    // Update is called once per frame
    void Update () {

        MovePlayer();

        float distCovered = (Time.time - startTime) * speed;
        float fracJourney = distCovered / journeyLength;

        if (!startPos.Equals(endPos))
            transform.position = Vector3.Lerp(startPos, endPos, fracJourney);

        if (transform.position == endPos)
        {
            isMoving = false;
        }
    }

    void MovePlayer()
    {
        Ray ray;
        RaycastHit hit;

        if (Input.GetMouseButtonDown(0) && !isMoving)
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            for (int i = 0; i < fieldGenerator.use.tilesList.Count; i++)
            {
                if (fieldGenerator.use.tilesList[i].selfObject.collider.Raycast(ray, out hit, float.PositiveInfinity))
                {
                    if (fieldGenerator.use.tilesList[i].selfObject.transform.position.x < transform.position.x && fieldGenerator.use.tilesList[i].selfObject.transform.position.y == transform.position.y)
                    {
                        angleToTurn = -180f;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    }
                    else if (fieldGenerator.use.tilesList[i].selfObject.transform.position.x > transform.position.x && fieldGenerator.use.tilesList[i].selfObject.transform.position.y == transform.position.y)
                    {
                        angleToTurn = 0;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    }
                    else if (fieldGenerator.use.tilesList[i].selfObject.transform.position.y < transform.position.y && fieldGenerator.use.tilesList[i].selfObject.transform.position.x == transform.position.x)
                    {
                        angleToTurn = -90f;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    }
                    else if (fieldGenerator.use.tilesList[i].selfObject.transform.position.y > transform.position.y && fieldGenerator.use.tilesList[i].selfObject.transform.position.x == transform.position.x)
                    {
                        angleToTurn = 90f;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    }

                    startTime = Time.time;
                    startPos = transform.position;
                    endPos = tileToMove.selfObject.transform.position;
                    journeyLength = Vector3.Distance(startPos, endPos);
                    transform.eulerAngles = new Vector3(0f, 0f, angleToTurn);
                }
            }
        }
    }
}
使用UnityEngine;
使用Holoville.HOTween;
使用系统集合;
公共类玩家:单一行为{
公共浮子速度=100f;
私人Vector3 startPos;
私有向量3 endPos;
私人浮动开始时间;
专用浮动行程长度;
私人瓷砖;
私人瓷砖瓷砖移动;
专用浮动角度旋转=0f;
private bool isMoving=假;
公共静态播放器使用;
无效唤醒()
{
使用=这个;
}
无效开始(){
startPos=endPos=transform.position;
tileToMove=currentTile=fieldGenerator.use.tilesList[0];
}
//每帧调用一次更新
无效更新(){
MovePlayer();
float distCovered=(Time.Time-startTime)*速度;
浮动行程=距离覆盖/行程长度;
如果(!startPos.Equals(endPos))
transform.position=Vector3.Lerp(起始位置、结束位置、行程);
if(transform.position==endPos)
{
isMoving=假;
}
}
void MovePlayer()
{
射线;
雷卡斯特击中;
if(Input.GetMouseButtonDown(0)&&&!isMoving)
{
ray=Camera.main.ScreenPointToRay(输入.鼠标位置);
对于(int i=0;itransform.position.x&&fieldGenerator.use.tilesList[i].selfObject.transform.position.y==transform.position.y)
{
转角=0;
tileToMove=fieldGenerator.use.tilesList[i];
isMoving=真;
}
else if(fieldGenerator.use.tilesList[i].selfObject.transform.position.ytransform.position.y&&fieldGenerator.use.tilesList[i].selfObject.transform.position.x==transform.position.x)
{
转角=90f;
tileToMove=fieldGenerator.use.tilesList[i];
isMoving=真;
}
startTime=Time.Time;
startPos=transform.position;
endPos=tileToMove.selfObject.transform.position;
行程长度=矢量3.距离(起点、终点);
transform.eulerAngles=新矢量3(0f,0f,角度旋转);
}
}
}
}
}

不确定你在用瓷砖和光线投射做什么,但我会这样做。抱歉格式化,这就是我的工作方式

编辑:好的,鉴于你说的“网格”运动,我假设瓷砖彼此之间的距离相等。GetMouseButtonDown也更改为GetMouseButton。这意味着每次更新时都会拍摄一条光线,您可能希望提高效率

using UnityEngine;
using Holoville.HOTween;
using System.Collections;

public class Player : MonoBehaviour {

    public float speed          = 100.0f;
    private float delta         = 0.0f;
    private float distance      = 1.0f;
    private Vector3 startPos;
    private Vector3 endPos;
    private tile currentTile;
    private tile tileToMove;
    private float angleToTurn   = 0f;
    private bool isMoving       = false;
    public static Player use;

    void Awake() {
        use = this;
    }

    void Start () {
        startPos = endPos = transform.position;
        tileToMove = currentTile = fieldGenerator.use.tilesList[0];
    }

    // Update is called once per frame
    void Update () {
        GetInput();
        MovePlayer();
    }

    void MovePlayer() {
        if ( isMoving ) {
            if ( delta < 1 ) {
                // Distance independant movement.
                delta += ( speed/distance ) * Time.deltaTime;
                transform.position = Vector3.Lerp(startPos, endPos, delta);
            } else {
                isMoving = false;
            }
        }
    }

    void GetInput() {
        Ray ray;
        RaycastHit hit;

        if ( Input.GetMouseButton(0) ) {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            for (int i = 0; i < fieldGenerator.use.tilesList.Count; i++) {
                if ( fieldGenerator.use.tilesList[i].selfObject.collider.Raycast( ray, out hit, float.PositiveInfinity ) ) {
                    if (fieldGenerator.use.tilesList[i].selfObject.transform.position.x < transform.position.x && fieldGenerator.use.tilesList[i].selfObject.transform.position.y == transform.position.y) {
                        angleToTurn = -180f;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    } else if (fieldGenerator.use.tilesList[i].selfObject.transform.position.x > transform.position.x && fieldGenerator.use.tilesList[i].selfObject.transform.position.y == transform.position.y) {
                        angleToTurn = 0;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    } else if (fieldGenerator.use.tilesList[i].selfObject.transform.position.y < transform.position.y && fieldGenerator.use.tilesList[i].selfObject.transform.position.x == transform.position.x) {
                        angleToTurn = -90f;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    } else if (fieldGenerator.use.tilesList[i].selfObject.transform.position.y > transform.position.y && fieldGenerator.use.tilesList[i].selfObject.transform.position.x == transform.position.x) {
                        angleToTurn = 90f;
                        tileToMove = fieldGenerator.use.tilesList[i];
                        isMoving = true;
                    }

                    isMoving    = true;
                    delta           = 0f;
                    startPos        = transform.position;
                    endPos      = tileToMove.selfObject.transform.position;
                    distance        = Vector3.Distance( startPos, endPos );
                    transform.eulerAngles = new Vector3(0f, 0f, angleToTurn);
                }
            }
        }
    }
}
使用UnityEngine;
使用Holoville.HOTween;
使用系统集合;
公共级玩家:单行为{
公共浮子速度=100.0f;
私人浮动增量=0.0f;
专用浮动距离=1.0f;
私人Vector3 startPos;
私有向量3 endPos;
私人瓷砖;
私人瓷砖瓷砖移动;
专用浮动角度旋转=0f;
private bool isMoving=假;
公共静态播放器使用;
无效唤醒(){
使用=这个;
}
无效开始(){
startPos=endPos=transform.position;
tileToMove=currentTile=fieldGenerator.use.tilesList[0];
}
//每帧调用一次更新
无效更新(){
GetInput();
MovePlayer();
}
void MovePlayer(){
如果(正在移动){
if(δ<1){
//与距离无关的运动。
delta+=(速度/距离)*Time.deltaTime;
transform.position=Vector3.Lerp(startPos、endPos、delta);
}否则{
isMoving=假;
}
}
}
void GetInput(){
射线;
雷卡斯特击中;
如果(Input.GetMouseButto