我正在开发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;
}
}
答案 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
太小了。它是一个小窗口,最有可能持续过度使你的角色绕目的地点摆动而不是靠近它。如果你把这个数字做得更大(可能试验看看哪个值合适),我认为它会正常工作。