C# 统一玩家2D运动
亲爱的程序员您好 我在学校有一个项目,在Unity中编写一个游戏。统一是非常复杂的理解和所有额外的。我想用另一款游戏的灵感制作一款类似神奇宝贝的游戏 我找到了这个源代码,并对它做了一些修改,以适应我的游戏。但我发现它可以让我的玩家从一个瓷砖移动到另一个瓷砖。我希望我的播放器可以自由移动,而不是从一个瓷砖移动到另一个瓷砖。是的,我在网格上制作了一个瓷砖贴图,带有瓷砖集。我的播放器是32 x 32C# 统一玩家2D运动,c#,unity3d,C#,Unity3d,亲爱的程序员您好 我在学校有一个项目,在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”变量值?问题是什么?你想要解决的问题是什么?理想的结果是什么?如果玩家不能从一块移动到另一块,我希望他能在地图上自由移动