如何解决Unity中的奇怪对撞机错误?

时间:2019-03-14 21:19:25

标签: unity3d

因此,我是Unity的新手,正在从事2D游戏。在这里,我只有一个背景,一条船和一个小岛。问题在于船不应该在岛下航行。

我做了一些研究,发现我应该有对撞机,所以知道我的船上有箱形撞机2d和刚体2d,而岛上有多边形撞机2d。问题在于,每当我尝试穿过小岛时,船就会陷入怪异的角度。

编辑:对不起,暂时没有视频,但是下面是完整的序列: enter image description here

如果需要,这是我的船只运动的脚本:

public float moveSpeed;
    private Animator anim;
    private bool playerMovement;
    private Vector2 lastMove;

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    } 

    // Update is called once per frame
    void Update()
    {
        playerMovement = false;
        if (Input.GetAxisRaw("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f) {
            transform.Translate(new Vector3(Input.GetAxisRaw("Horizontal") * moveSpeed * Time.deltaTime,0f,0f));
            playerMovement = true;
            lastMove = new Vector2(Input.GetAxisRaw("Horizontal"), 0f);
        }

        if (Input.GetAxisRaw("Vertical") > 0.5f || Input.GetAxisRaw("Vertical") < -0.5f)
        {
            transform.Translate(new Vector3(0f, Input.GetAxisRaw("Vertical") * moveSpeed * Time.deltaTime, 0f));
            playerMovement = true;
            lastMove = new Vector2(0f, Input.GetAxisRaw("Vertical"));
        }
        anim.SetFloat("MoveX", Input.GetAxisRaw("Horizontal"));
        anim.SetFloat("MoveY", Input.GetAxisRaw("Vertical"));
        anim.SetBool("PlayerMoving", playerMovement);
        anim.SetFloat("LastMoveX", lastMove.x);
        anim.SetFloat("LastMoveY", lastMove.y);
    }

动画师-enter image description here

3 个答案:

答案 0 :(得分:0)

我认为您正在得到奇怪的行为,因为您试图同时通过动画和物理来控制对象。每当碰到对撞机时,动画师都会中断物理模拟。您可以尝试将Rigidbody2D BodyType更改为Kinematic

enter image description here

无论如何,只要您的船动画/动作如此简单,最好使用物理而非动画师来控制动作。将动画器用于诸如船舶爆炸,下沉等动画,并通过物理或变换控制您的船舶位置。

答案 1 :(得分:0)

sortingLayerName更改为所需的名称。

myCanvasObject.GetComponent(Canvas).sortingLayerName="mySortingLayer";

您也可以在统一编辑器中完成此操作。

enter image description here

答案 2 :(得分:0)

为了应用物理,应该使用Rigidbody2D而不是Transform

使用Rigidbody2D.velocity代替使用transform.Translate()来移动飞船。

开始时,您可以像执行Rigidbody2D一样获得Animator

rb = gameObject.GetComponent<Rigidbody2D>();

然后您可以根据输入来设置其速度:

rb.velocity = new Vector2(
    Input.GetAxisRaw("Horizontal") * moveSpeed,
    Input.GetAxisRaw("Vertical") * moveSpeed);

此外,请确保将刚体设置为“运动学”(与先前的答案不同)。