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