3

The bases of my game is a simple 2D top down click to move game I. I created a walk blend tree and a idle blend tree. The both blend tree has 6 directional movement. I watch this tutorial on Top-down 8 directions movement. (https://www.youtube.com/watch?v=7URRg8J6mz8). Basically I change the script around so that it could match with my click to move script, but it not 100% perfect. My idle state is not working properly or neither is my Y-axis, to be more speific, when I click long the Y-axis (let's say i'm going up(+)) it's not really playing the right animation in the animator. (Now let's say I went down) It would play the right animation but (when finished with movement) it would continue playing the animation. My parameters are also not working properly, SpeedY and LastMoveY aren't stable (if i'm making any sense). Can someone help me fix this? Here's my game preview uploaded in google drive if anyone doesn't understand what I mean! http://html.editey.com/file/0B6cfYGCOex7BVC1Ja3Q3N3d3NWc#

using UnityEngine;
using System.Collections;

public class move : MonoBehaviour {

private Animator anim;
public float speed = 15f;
public move playerMovementRef;
private Vector3 target;
private Vector3 playerObject;


void Start () {
    target = transform.position;
    anim = GetComponent<Animator> ();
}

void Update () {
    if (Input.GetMouseButtonDown(0)) {
        target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        target.z = transform.position.z;
    }
    transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
    float inputX = Input.GetAxis ("Mouse X");
    float inputY = Input.GetAxis ("Mouse Y");

    if (Input.touchCount > 0)
    {
        inputX = Input.touches[0].deltaPosition.x;
        inputY = Input.touches[0].deltaPosition.y;
    }

    anim.SetFloat ("SpeedX", inputX);
    anim.SetFloat ("SpeedY", inputY);

}

void FixedUpdate () {

    float LastInputX = Input.GetAxis ("Mouse X");
    float LastInputY = Input.GetAxis ("Mouse Y");

    if (Input.touchCount > 0)
    {
        LastInputX = Input.touches[0].deltaPosition.x;
        LastInputY = Input.touches[0].deltaPosition.y;
    }

    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.SetBool ("walking", false);
        }
        if (LastInputY > 0) {
            anim.SetFloat ("LastMoveY", 1f);
        } else if (LastInputY < 0) {
            anim.SetFloat ("LastMoveY", -1f);
        } else {
            anim.SetFloat ("LastMoveY", 0f);
        }

    } else {
        anim.SetBool ("walking", false);
    }
}
4

1 回答 1

2

You should not use Input values inside FixedUpdate. You should store it in a variable inside Update and then check it inside FixedUpdate.

You should also add some depth to the mouse position according to your camera.

wrong:

void FixedUpdate () {
       if (Input.touchCount > 0)
       {
           ...
       }
}

correct:

    void Update () {
           ...
           if (Input.touchCount > 0)
           {
                touched = true;
           }
    }

    void FixedUpdate () {
           if (touched)
           {
                ...
           }
    }

sample:

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;
    }

    if (Input.touchCount > 0)
    {
        target.x = Input.touches[0].deltaPosition.x;
        target.y = Input.touches[0].deltaPosition.y;
    }

    transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
}

void FixedUpdate()
{
    float LastInputX = transform.position.x - target.x;
    float LastInputY = transform.position.y - target.y;

    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.SetBool("walking", false);
        }
        if (LastInputY > 0)
        {
            anim.SetFloat("LastMoveY", 1f);
        }
        else if (LastInputY < 0)
        {
            anim.SetFloat("LastMoveY", -1f);
        }
        else {
            anim.SetFloat("LastMoveY", 0f);
        }

    }
    else {
        anim.SetBool("walking", false);
    }
}
于 2015-12-07T12:58:45.083 回答