unity3d - Spring Joint 2D(可能)导致 transform.position 错误
问题描述
在您看到问题所在后,我知道标题可能会产生误导,但我真的不知道如何命名这个问题。第一张图显示了问题。
白线表示玩家和称为钩子的游戏对象之间的距离。靠近钩子的蓝色精灵球体是 SpringJoint2D.connectedBody。
它们(白线和蓝色精灵)都使用相同的值:hook.transform.position。
以下是我认为导致问题或至少揭示最多的代码片段:
SpringJoint2D 片段:
if (Input.GetMouseButtonDown(0))
{
hook = FindClosestObject(radius, "Hook");
if(hook != null)
{
joint.enabled = true;
joint.connectedBody = hook;
joint.connectedAnchor = hook.transform.position;
Debug.Log("Click.");
Debug.Log(hook);
}
}
if (Input.GetMouseButtonUp(0))
{
joint.enabled = false;
joint.connectedBody = null;
}
Debug.DrawLine 片段:
if (hook != null)
{
joint.distance = Vector3.Distance(hook.transform.position, transform.position) / 2;
Debug.DrawLine(transform.position, hook.transform.position);
}
这是整个代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerScript : MonoBehaviour
{
public float radius;
private SpringJoint2D joint;
private Rigidbody2D hook = new Rigidbody2D();
// Start is called before the first frame update
void Start()
{
joint = GetComponent<SpringJoint2D>();
}
// Update is called once per frame
void Update()
{
//touch.phase == TouchPhase.Began
if (Input.GetMouseButtonDown(0))
{
hook = FindClosestObject(radius, "Hook");
if(hook != null)
{
joint.enabled = true;
joint.connectedBody = hook;
joint.connectedAnchor = hook.transform.position;
Debug.Log("Click.");
Debug.Log(hook);
}
}
if (Input.GetMouseButtonUp(0))
{
joint.enabled = false;
joint.connectedBody = null;
}
//foreach (Touch touch in Input.touches)
//{
//}
if (hook != null)
{
joint.distance = Vector3.Distance(hook.transform.position, transform.position) / 2;
Debug.DrawLine(transform.position, hook.transform.position);
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.green;
Gizmos.DrawWireSphere(transform.position, radius);
if (hook != null)
Gizmos.DrawLine(transform.position, hook.transform.position);
}
public Rigidbody2D FindClosestObject(float radius, string tag)
{
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag(tag);
Rigidbody2D closest = null;
float distance = radius;
Vector3 position = transform.position;
foreach (GameObject go in gos)
{
Vector3 diff = go.transform.position - position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance)
{
closest = go.GetComponent<Rigidbody2D>();
distance = curDistance;
}
}
return closest;
}
}
解决方案
啊,我只是愚蠢。
如果您还分配了 connectedRigidbody2D,则无需分配 connectedAnchor connectedAnchor 是与 connectedRigidbody2D 位置的偏移量...
推荐阅读
- ios - Firebase:第二次调用 setUserID() 似乎不起作用
- sql - 我的查询只占我的一点而不是全部
- java - 如何将 Java 库导入 Android Studio?
- laravel - 一次性替换 Laravel 5.7 中的翻译结果?
- apache-spark - 到 rdd 的结构化流式传输不起作用
- laravel - Laravel 邮递员问题
- c# - 如何在 ASP.NET Core 应用程序中使用位图资源?
- python - 如何过滤熊猫数据框中的行,其中列的值等于列表的某个值
- android - 为什么这段代码中没有对 ImageView 的引用?
- db2 - 如何确定在某个表上持有锁的应用程序和应用程序ID