因此,我是Unity的新手,正在从事2D游戏。在这里,我只有一个背景,一条船和一个小岛。问题在于船不应该在岛下航行。
我做了一些研究,发现我应该有对撞机,所以知道我的船上有箱形撞机2d和刚体2d,而岛上有多边形撞机2d。问题在于,每当我尝试穿过小岛时,船就会陷入怪异的角度。
如果需要,这是我的船只运动的脚本:
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);
}
答案 0 :(得分:0)
我认为您正在得到奇怪的行为,因为您试图同时通过动画和物理来控制对象。每当碰到对撞机时,动画师都会中断物理模拟。您可以尝试将Rigidbody2D
BodyType
更改为Kinematic
:
无论如何,只要您的船动画/动作如此简单,最好使用物理而非动画师来控制动作。将动画器用于诸如船舶爆炸,下沉等动画,并通过物理或变换控制您的船舶位置。
答案 1 :(得分:0)
将sortingLayerName
更改为所需的名称。
myCanvasObject.GetComponent(Canvas).sortingLayerName="mySortingLayer";
您也可以在统一编辑器中完成此操作。
答案 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);
此外,请确保将刚体未设置为“运动学”(与先前的答案不同)。