addforce() unity 3d与2d角色控制器
Addforce () unity3d with 2d character conroller
我正在开发 2D 游戏关卡,但使用 Unity3d 和 C# 编码在 3D 环境中制作它。我为我的角色制作了这个控制器,因为我希望它跟随鼠标的位置(就像小偷控制),但我的角色真的很疯狂,当我点击它时它只是移动......虽然不像看起来那么随机但真的摇摇欲坠我的鼠标位置...这是我的代码,如果您有任何好的教程或类似 Tiny Thief 游戏的东西,请告诉我。谢谢你。
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;
}
}
这似乎是我喜欢称之为 "slingshot problem" 的一个例子。你告诉你的角色向一个点移动,它越过那个点,试图回到那个点,再次越过它,并永远重复。
您的控件使用 "target position"。每一帧,都会对角色的刚体施加力,直到他到达目标位置。等他到了,就别加力了。
relativePos = wantedPos.x - transform.position.x;
if (Mathf.Abs (relativePos) > 1) {
transform.GetComponent<Rigidbody2D> ().AddForce (new Vector2 (relativePos, 0f) * 40f, ForceMode2D.Force);
}
这里的这一部分是解决弹弓问题的好一步。而不是检查目标位置上的完全匹配,这是极不可能发生的,而是检查角色是否已经接近它,在 1 个单位内。
我觉得你这里的1
太小了。这是一个很小的 window ,很可能会一直被超越,导致你的角色在它的目的地周围摆动而不是在它附近停下来。如果你把这个数字变大(也许试验一下看看什么值合适),我认为它会正常工作。
我正在开发 2D 游戏关卡,但使用 Unity3d 和 C# 编码在 3D 环境中制作它。我为我的角色制作了这个控制器,因为我希望它跟随鼠标的位置(就像小偷控制),但我的角色真的很疯狂,当我点击它时它只是移动......虽然不像看起来那么随机但真的摇摇欲坠我的鼠标位置...这是我的代码,如果您有任何好的教程或类似 Tiny Thief 游戏的东西,请告诉我。谢谢你。
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;
}
}
这似乎是我喜欢称之为 "slingshot problem" 的一个例子。你告诉你的角色向一个点移动,它越过那个点,试图回到那个点,再次越过它,并永远重复。
您的控件使用 "target position"。每一帧,都会对角色的刚体施加力,直到他到达目标位置。等他到了,就别加力了。
relativePos = wantedPos.x - transform.position.x;
if (Mathf.Abs (relativePos) > 1) {
transform.GetComponent<Rigidbody2D> ().AddForce (new Vector2 (relativePos, 0f) * 40f, ForceMode2D.Force);
}
这里的这一部分是解决弹弓问题的好一步。而不是检查目标位置上的完全匹配,这是极不可能发生的,而是检查角色是否已经接近它,在 1 个单位内。
我觉得你这里的1
太小了。这是一个很小的 window ,很可能会一直被超越,导致你的角色在它的目的地周围摆动而不是在它附近停下来。如果你把这个数字变大(也许试验一下看看什么值合适),我认为它会正常工作。