C# 在统一中触摸运动,这能做得更好或更有效吗?

C# 在统一中触摸运动,这能做得更好或更有效吗?,c#,android,unity3d,touch,C#,Android,Unity3d,Touch,这段代码是有效的,尽管我不确定是否可以做得更好,是否使用了太多的资源来完成这项工作 我还在学习,如果有什么可以改进的地方,我愿意这样做 该代码适用于移动设备,按手指在屏幕上移动的确切距离移动播放器。 我把它设置成现在的样子,这样无论手指放在屏幕上的什么地方,它都从零开始,然后在移动的时候,它取出零的数据,将它与手指在屏幕上的位置进行比较,从比较中得到数学值,然后用代码末尾的结束位置减去它(这样做是因为如果不这样做,玩家会重置到屏幕的中心,或者在手指离开屏幕移动之前的位置,然后再次将手指放回屏

这段代码是有效的,尽管我不确定是否可以做得更好,是否使用了太多的资源来完成这项工作

我还在学习,如果有什么可以改进的地方,我愿意这样做

  • 该代码适用于移动设备,按手指在屏幕上移动的确切距离移动播放器。
    • 我把它设置成现在的样子,这样无论手指放在屏幕上的什么地方,它都从零开始,然后在移动的时候,它取出零的数据,将它与手指在屏幕上的位置进行比较,从比较中得到数学值,然后用代码末尾的结束位置减去它(这样做是因为如果不这样做,玩家会重置到屏幕的中心,或者在手指离开屏幕移动之前的位置,然后再次将手指放回屏幕上),然后最后从玩家的当前位置中减去该位置以移动玩家
我曾尝试在网上四处寻找各种其他方法来实现这一点,但如果手指被提起,则在没有播放器重置到先前位置的情况下,将此代码再次放在屏幕上或屏幕中央

Vector2 touchStartPos;
Vector2 touchMovedPos;
Vector2 touchDiffPos;
Vector2 touchEndPos;

public Rigidbody2D rb;

private void Start()
{
    touchStartPos = Vector2.zero;
    touchMovedPos = Vector2.zero;
    touchEndPos = Vector2.zero;
}
void Update()
{
    if (Input.touchCount > 0)
    {
        Vector2 touch = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
        Touch touchType = Input.GetTouch(0);

        switch (touchType.phase)
        {
            case TouchPhase.Began:
                touchStartPos = touch;
                break;
            case TouchPhase.Moved:
                touchMovedPos = touchStartPos - touch;
                touchDiffPos = touchMovedPos - touchEndPos;
                Vector2 touchMathedPos = rb.position - touchDiffPos;

                rb.MovePosition(touchMathedPos);

                touchEndPos = touchMovedPos;

                break;
            case TouchPhase.Ended:
                touchEndPos = Vector2.zero;
                break;
        }
    }
    else
    {
        return;
    }
}

是什么让你觉得这样做效率不高?我能在你的代码中找到的唯一“错误”是重复访问
Camera.main
,这相当昂贵..而是将此引用存储在字段中一次,你应该是好的;)哦,你可以少用一个向量场,只需要
StartPos
CurrentPos
并按差移动
EndPos
有点多余,请注意整个过程应该在
FixedUpdate
中完成。。。不要在
Update
中调用物理相关的东西(
MovePosition
)!从我的理解来看,这么多向量2有点太多了。我还想我试着把它存储在start中,但它要么把位置存储在零向量上,要么抛出一个错误。我会在回家后再试一次,当然会把它改成FixedUpdate!一旦我这样做了,我会再次发表评论,并更新进展情况。感谢您的回复,很抱歉,部分原因是我了解到我不确定我的代码在效率方面工作得有多好。@derHugo所以我将其更改为FixedUpdate(),谢谢您,完全忘记了物理应该在那里,我确实发现如果您将Camera.main调用放在Start()中,我得到了一个索引超出范围的错误,代码根本不会运行,并且试图删除EndPos会导致重置回最后位置的问题。非常感谢你的帮助!我的原始版本很久以前只是startPos,与移动的版本相比,但是我不得不开发这个长方法来防止重置,只是认为它可能做得更好。