好的,基本的,我有一个2d自上而下的点击移动游戏与一个小问题。你看,我创造了我的玩家有三个心脏生命,并且当你被一个物体击中后你会失去一颗心,一旦你失去了一颗心,玩家就会自动重新产生回到他开始的地方。但是我在玩家的运动方面遇到了问题,如前所述移动我的播放器你必须点击(点击移动)。当我点击一个地方并被一个物体击中时,我的玩家会回到它开始的地方(这就是我想要的)但是在重置回到它开始的地方后,我的玩家会继续移动直到它到达目的地(这不是我想要的)
这是我的播放器动作剧本:
public class PlayerMovement : MonoBehaviour {
private Animator anim;
public float speed = 15f;
private Vector3 target;
public PlayerMovement playerMovementRef;
private bool touched;
void Start () {
target = transform.position;
anim = GetComponent<Animator> ();
}
void Update () {
if (Input.GetMouseButtonDown (0)) {
Vector3 mousePosition = Input.mousePosition;
mousePosition.z = 10; // distance from the camera
target = Camera.main.ScreenToWorldPoint(mousePosition);
target.z = transform.position.z;
}
transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
var movementDirection = (target - transform.position).normalized;
if (movementDirection.x != 0 || movementDirection.y != 0) {
anim.SetBool ("walking", false);
anim.SetFloat("SpeedX", movementDirection.x);
anim.SetFloat("SpeedY", movementDirection.y);
anim.SetBool ("walking", true);
}
}
void FixedUpdate () {
float LastInputX = transform.position.x - target.x;
float LastInputY = transform.position.y - target.y;
if (touched) {
if (LastInputX != 0 || LastInputY != 0) {
anim.SetBool ("walking", true);
if (LastInputX < 0) {
anim.SetFloat ("LastMoveX", 1f);
} else if (LastInputX > 0) {
anim.SetFloat ("LastMoveX", -1f);
} else {
anim.SetFloat ("LastMoveX", 0f);
}
if (LastInputY > 0) {
anim.SetFloat ("LastMoveY", 1f);
} else if (LastInputY < 0) {
anim.SetFloat ("LastMoveY", -1f);
} else {
anim.SetFloat ("LastMoveY", 0f);
}
}
}else{
touched = false;
anim.SetBool ("walking", false);
}
}
}
这是我的播放器健康脚本(此脚本将我的播放器重新生成回到被对象击中后开始的位置):
public class PlayerHealth : MonoBehaviour {
//Stats
public int curHealth;
public int maxHealth = 3;
Vector3 startPosition;
void Start ()
{
curHealth = maxHealth;
startPosition = transform.position;
}
void Update ()
{
if (curHealth > maxHealth) {
curHealth = maxHealth;
}
if (curHealth <= 0) {
Die ();
}
}
void Die ()
{
//Restart
Application.LoadLevel (Application.loadedLevel);
}
public void Damage(int dmg)
{
curHealth -= dmg;
Reset();
}
void Reset()
{
transform.position = startPosition;
}
}
答案 0 :(得分:1)
因此,当您首次点击玩家走向的位置时,
Input.GetMouseButtonDown (0)
是正确的,因此在if
语句中,您使用以下行设置mousePosition:
Vector3 mousePosition = Input.mousePosition;
然后将目标设置为等于
target = Camera.main.ScreenToWorldPoint(mousePosition);
问题是在if语句之外,但在update方法中,你有
transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
玩家的帖子不断改变以向目标移动。这导致了问题,因为即使在你重新生成后也会不断调用update(),如果你没有为目标分配不同的值,你的玩家仍然会朝着目标移动,目标是在玩家死亡之前设置的。
简而言之,当你点击一个移动的地方时,目标只会被设置一次,但是你的角色总是朝着目标移动,即使他重生了。在Start()
方法内部,写下PlayerMovement.target = startPosition
请记住,目标必须是公开的,或者有公共的getter和setter,以便能够从您的健康类中访问它。