Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一玩家2D运动_C#_Unity3d - Fatal编程技术网

C# 统一玩家2D运动

C# 统一玩家2D运动,c#,unity3d,C#,Unity3d,亲爱的程序员您好 我在学校有一个项目,在Unity中编写一个游戏。统一是非常复杂的理解和所有额外的。我想用另一款游戏的灵感制作一款类似神奇宝贝的游戏 我找到了这个源代码,并对它做了一些修改,以适应我的游戏。但我发现它可以让我的玩家从一个瓷砖移动到另一个瓷砖。我希望我的播放器可以自由移动,而不是从一个瓷砖移动到另一个瓷砖。是的,我在网格上制作了一个瓷砖贴图,带有瓷砖集。我的播放器是32 x 32 我想改变重力和灵敏度可能会让他在地图上移动得更快。我的播放器也只允许我一次按一个键,所以我必须等到播放

亲爱的程序员您好

我在学校有一个项目,在Unity中编写一个游戏。统一是非常复杂的理解和所有额外的。我想用另一款游戏的灵感制作一款类似神奇宝贝的游戏

我找到了这个源代码,并对它做了一些修改,以适应我的游戏。但我发现它可以让我的玩家从一个瓷砖移动到另一个瓷砖。我希望我的播放器可以自由移动,而不是从一个瓷砖移动到另一个瓷砖。是的,我在网格上制作了一个瓷砖贴图,带有瓷砖集。我的播放器是32 x 32


我想改变重力和灵敏度可能会让他在地图上移动得更快。我的播放器也只允许我一次按一个键,所以我必须等到播放器移动瓷砖的长度,然后我才能改变方向。我也不太了解代码是如何精确工作的(数学方面的东西)。我希望我给了你足够的信息

using UnityEngine;
using System.Collections;

public class PlayerMovement : MonoBehaviour {

    Direction currentDir;
    Vector2 input;
    bool isMoving = false;
    Vector3 startPos;
    Vector3 endPos;
    float t;

    public Sprite northSprite;
    public Sprite eastSprite;
    public Sprite southSprite;
    public Sprite westSprite;

    public float walkSpeed = 1f;

    public bool isAllowedToMove = true;

    void Start()
    {
        isAllowedToMove = true;
    }

    void Update () { 

        if(!isMoving && isAllowedToMove)
        {
            input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
            if (Mathf.Abs(input.x) > Mathf.Abs(input.y))
                input.y = 0;
            else
                input.x = 0;

            if(input != Vector2.zero)
            {

                if(input.x < 0)
                {
                    currentDir = Direction.West;
                }
                if(input.x > 0)
                {
                    currentDir = Direction.East;
                }
                if(input.y < 0)
                {
                    currentDir = Direction.South;
                }
                if (input.y > 0)
                {
                    currentDir = Direction.North;
                }

                switch(currentDir)
                {
                    case Direction.North:
                        gameObject.GetComponent<SpriteRenderer>().sprite = northSprite;
                        break;
                    case Direction.East:
                        gameObject.GetComponent<SpriteRenderer>().sprite = eastSprite;
                        break;
                    case Direction.South:
                        gameObject.GetComponent<SpriteRenderer>().sprite = southSprite;
                        break;
                    case Direction.West:
                        gameObject.GetComponent<SpriteRenderer>().sprite = westSprite;
                        break;
                }

                StartCoroutine(Move(transform));
            }

        }

    }

    public IEnumerator Move(Transform entity)
    {
        isMoving = true;
        startPos = entity.position;
        t = 0;

        endPos = new Vector3(startPos.x + System.Math.Sign(input.x), startPos.y + System.Math.Sign(input.y), startPos.z);

        while (t < 1f)
        {
            t += Time.deltaTime * walkSpeed;
            entity.position = Vector3.Lerp(startPos, endPos, t);
            yield return null;
        }

        isMoving = false;
        yield return 0;
    }
}

enum Direction
{
    North,
    East,
    South,
    West
}
使用UnityEngine;
使用系统集合;
公共类玩家运动:单一行为{
方向电流方向;
矢量2输入;
bool isMoving=false;
Vector3 startPos;
向量3末端位置;
浮动t;
公共雪碧;
公共雪碧;
公共雪碧南雪碧;
公共雪碧;
公共浮子行走速度=1f;
public bool isAllowedToMove=true;
void Start()
{
isAllowedToMove=真;
}
无效更新(){
如果(!isMoving&&isAllowedToMove)
{
输入=新矢量2(input.GetAxis(“水平”),input.GetAxis(“垂直”);
if(Mathf.Abs(input.x)>Mathf.Abs(input.y))
输入y=0;
其他的
输入x=0;
如果(输入!=Vector2.zero)
{
如果(输入x<0)
{
currentDir=方向。西;
}
如果(input.x>0)
{
currentDir=向东方向;
}
如果(输入y<0)
{
currentDir=向南的方向;
}
如果(输入y>0)
{
currentDir=北向;
}
开关(currentDir)
{
案件方向:北:
gameObject.GetComponent().sprite=northSprite;
打破
案例方向:东:
gameObject.GetComponent().sprite=eastSprite;
打破
案例方向:南部:
gameObject.GetComponent().sprite=southSprite;
打破
案例方向:西:
gameObject.GetComponent().sprite=westSprite;
打破
}
开始例行程序(移动(变换));
}
}
}
公共IEnumerator移动(转换实体)
{
isMoving=真;
startPos=实体.position;
t=0;
endPos=newvector3(startPos.x+System.Math.Sign(input.x),startPos.y+System.Math.Sign(input.y),startPos.z);
而(t<1f)
{
t+=时间增量*行走速度;
entity.position=Vector3.Lerp(startPos,endPos,t);
收益返回空;
}
isMoving=假;
收益率为0;
}
}
枚举方向
{
北,
东方,,
南方
西部
}

该代码一次只允许一个键(直到播放器移动完成)的原因是,更新函数是代码捕捉输入键的地方,并且该函数中的if语句在角色移动时不满足条件

if(!isMoving&&isAllowedToMove)
当此if语句满足要求并且您输入一个键来移动播放机时,它将启动移动功能

start例程(移动(转换));
此移动函数将布尔值isMoving设置为true(isMoving需要为false才能满足前一条if语句中的条件)。该布尔值不会设置回false,直到角色在平铺长度上移动,平铺长度在while循环中编码

while(t<1f)
{
t+=时间增量*行走速度;
entity.position=Vector3.Lerp(startPos,endPos,t);
收益返回空;
}

我建议从玩这个while循环开始,因为看起来玩家在循环完成之前无法移动。

“我想改变重力和灵敏度可能会让他在地图上移动得更快。”--也许可以尝试改变“walkSpeed”变量值?问题是什么?你想要解决的问题是什么?理想的结果是什么?如果玩家不能从一块移动到另一块,我希望他能在地图上自由移动