[英]Unity Player 2D Movement
尊敬的程序員您好,
我在學校有一個項目要在 Unity 中編寫游戲。 Unity 非常難以理解,而且還有它的所有附加功能。 我想從另一款游戲中汲取靈感,制作一款類似 Pokémon 的游戲。
我找到了這個源代碼並對其進行了一些更改,以適應我的游戲。 但我發現它可以讓我的玩家在瓷磚之間移動。 我希望我的玩家可以自由移動,而不是從一個瓷磚到另一個瓷磚。 是的,我在網格上制作了瓷磚地圖,帶有瓷磚集。 我的播放器是 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
}
尊敬的程序員您好,
我在學校有一個項目要在 Unity 中編寫游戲。 Unity 非常難以理解,而且還有它的所有附加功能。 我想從另一款游戲中汲取靈感,制作一款類似 Pokémon 的游戲。
我找到了這個源代碼並對其進行了一些更改,以適應我的游戲。 但我發現它可以讓我的玩家在瓷磚之間移動。 我希望我的玩家可以自由移動,而不是從一個瓷磚到另一個瓷磚。 是的,我在網格上制作了瓷磚地圖,帶有瓷磚集。 我的播放器是 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.