Addforce()统一3d与2d字符控制器

时间:2015-03-24 13:55:47

标签: c# unity3d unityscript

我正在开发2D游戏关卡,但是使用Unity3d和c#编码在3D环境中制作它。我为我的角色制作了这个控制器,因为我希望它跟随鼠标位置(就像微小的小偷控制),但我的角色真的很疯狂,当我点击它只是移动......好吧不是随机看起来但是真的很不稳定我的鼠标位置......这是我的代码,如果你有任何好的教程或类似小小偷的游戏,请告诉我。谢谢。

using UnityEngine;
using System.Collections;


//  [RequireComponent(typeof (PlatformerCharacter2D))]
using System;


public class Robot_Moves : MonoBehaviour
{
    private Vector3 wantedPos;
    private Vector3 mousePos;
    private float relativePos;
    [HideInInspector]
    public bool
        facingRight = false;

    void Update ()
    {
        if (Time.time > 2) {
            if (Input.GetMouseButtonDown (0)) {
                mousePos = Input.mousePosition;
                mousePos.z = 100f;
                mousePos.y = 0f;
                wantedPos = Camera.main.ScreenToWorldPoint (mousePos);
                Debug.Log (wantedPos);

            }
            relativePos = wantedPos.x - transform.position.x;
            if (Mathf.Abs (relativePos) > 1) {
                transform.GetComponent<Rigidbody2D> ().AddForce (new Vector2 (relativePos, 0f) * 40f, ForceMode2D.Force);
            }
        }
    }
    void FixedUpdate ()
    {
        if (relativePos > 0 && facingRight)
            Flip ();
        else if (relativePos < 0 && !facingRight)
            Flip ();
    }

    void Flip ()
    {
        facingRight = !facingRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }
}

1 个答案:

答案 0 :(得分:1)

这似乎是我喜欢称之为&#34;弹弓问题&#34;的一个例子。你告诉你的角色朝着一个点移动,它超过那个点,试图向那个点移动,再次超过它,并且永远地重复它。

您的控件使用&#34;目标位置&#34;。每个框架,为角色的刚体增加力量,直到他到达目标位置。一旦他在那里,停止增加力量。

relativePos = wantedPos.x - transform.position.x;
if (Mathf.Abs (relativePos) > 1) {
    transform.GetComponent<Rigidbody2D> ().AddForce (new Vector2 (relativePos, 0f) * 40f, ForceMode2D.Force);
}

这一节是解决弹弓问题的一个很好的一步。而不是检查目标位置上的完全匹配,这是不太可能发生的,你检查角色是否已经接近它,在1个单位内。

我认为你的1太小了。它是一个小窗口,最有可能持续过度使你的角色绕目的地点摆动而不是靠近它。如果你把这个数字做得更大(可能试验看看哪个值合适),我认为它会正常工作。