Unity2D:玩家在重生后继续前进

时间:2016-07-22 19:00:05

标签: unity3d

好的,基本的,我有一个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;
    }
}

1 个答案:

答案 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,以便能够从您的健康类中访问它。