如何让玩家在 Unity 中在物体前后移动
How To Allow Player To Move In Front And Behind Objects In Unity
我正在使用 Unity 3D 制作一款 2D 风格的游戏。摄像机只从左到右跟随玩家,但我希望我的环境有深度感。这不是一款自上而下的游戏,它更像是一款 2d 马里奥平台游戏。我希望玩家能够在物体前面移动,例如,当他们向下按时,一棵树会在他们身后,如果他们向上按以进一步回到环境中,那么树现在就在他们面前.
这是我到目前为止的动作脚本。
using UnityEngine;
using System.Collections;
public class Move : MonoBehaviour {
Animator anim;
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
Movement ();
}
void Movement(){
anim.SetFloat("Speed", Mathf.Abs (Input.GetAxisRaw ("Horizontal")));
if (Input.GetAxisRaw ("Horizontal") > 0) {
transform.Translate(Vector2.right* 4f*Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
if (Input.GetAxisRaw ("Horizontal") < 0) {
transform.Translate (Vector2.right * 4f * Time.deltaTime);
transform.eulerAngles = new Vector2 (0, 180);
}
if(Input.GetAxisRaw("Vertical") >0){
transform.Translate (Vector2.up * 4f * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
if(Input.GetAxisRaw("Vertical") <0){
transform.Translate (Vector2.down * 4f * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
}
}
听起来您需要更改 sprite 的排序顺序,以便当玩家在树上方时,玩家 sprite 排序在它后面。尝试将类似这样的内容添加到播放器和所有树上组件的 update() 中。
var sprite = GetComponent<SpriteRenderer>();
sprite.sortingOrder = Mathf.RoundToInt(transform.position.y * -10f);
如果您在导入时将精灵的枢轴设置为它们接触地面的位置,则此方法效果最佳。
一种解决方案是简单地更改播放器位置的 Z 轴值。我的理解是,当相机指向+Z方向时,Z值较低的精灵将位于其他精灵的前面。
通过改变你的玩家的 Z 值将改变他们被绘制的顺序,从而使它看起来在某些元素的后面或前面。当然,要使其发挥作用,您的关卡应该在 Z 轴上的不同值处构建环境。
if (Input.GetKeyDown (KeyCode.UpArrow)) {
transform.Translate (new Vector3 (0, 0, 1));
}
if (Input.GetKeyDown (KeyCode.DownArrow)) {
transform.Translate (new Vector3 (0, 0, -1));
}
解决方案实际上取决于您如何设置关卡。
如果一切都在同一条车道上,那么修改精灵渲染器的排序顺序可以为您提供解决方案。
检查精灵渲染器文档:
https://docs.unity3d.com/Manual/class-SpriteRenderer.html
挑战来了,如果所有东西都在不同的层上。我所说的层是指您提供精灵渲染器的排序层。这会产生一些有趣的结果,因为仅仅修改排序顺序是不够的,您还必须更改图层。如果我没记错的话,您将在项目设置中将图层更改为它上面的图层。如果一切都在同一层上,那么更改排序顺序就足够了。
不要忘记考虑碰撞检测的潜在问题,因为更改游戏对象的车道意味着您可能必须将其物理层更改为,这样碰撞体就不会碰到任何东西层在前面。
https://docs.unity3d.com/Manual/LayerBasedCollision.html
希望这能引导您朝着正确的方向前进。
我正在使用 Unity 3D 制作一款 2D 风格的游戏。摄像机只从左到右跟随玩家,但我希望我的环境有深度感。这不是一款自上而下的游戏,它更像是一款 2d 马里奥平台游戏。我希望玩家能够在物体前面移动,例如,当他们向下按时,一棵树会在他们身后,如果他们向上按以进一步回到环境中,那么树现在就在他们面前.
这是我到目前为止的动作脚本。
using UnityEngine;
using System.Collections;
public class Move : MonoBehaviour {
Animator anim;
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
Movement ();
}
void Movement(){
anim.SetFloat("Speed", Mathf.Abs (Input.GetAxisRaw ("Horizontal")));
if (Input.GetAxisRaw ("Horizontal") > 0) {
transform.Translate(Vector2.right* 4f*Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
if (Input.GetAxisRaw ("Horizontal") < 0) {
transform.Translate (Vector2.right * 4f * Time.deltaTime);
transform.eulerAngles = new Vector2 (0, 180);
}
if(Input.GetAxisRaw("Vertical") >0){
transform.Translate (Vector2.up * 4f * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
if(Input.GetAxisRaw("Vertical") <0){
transform.Translate (Vector2.down * 4f * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}
}
}
听起来您需要更改 sprite 的排序顺序,以便当玩家在树上方时,玩家 sprite 排序在它后面。尝试将类似这样的内容添加到播放器和所有树上组件的 update() 中。
var sprite = GetComponent<SpriteRenderer>();
sprite.sortingOrder = Mathf.RoundToInt(transform.position.y * -10f);
如果您在导入时将精灵的枢轴设置为它们接触地面的位置,则此方法效果最佳。
一种解决方案是简单地更改播放器位置的 Z 轴值。我的理解是,当相机指向+Z方向时,Z值较低的精灵将位于其他精灵的前面。
通过改变你的玩家的 Z 值将改变他们被绘制的顺序,从而使它看起来在某些元素的后面或前面。当然,要使其发挥作用,您的关卡应该在 Z 轴上的不同值处构建环境。
if (Input.GetKeyDown (KeyCode.UpArrow)) {
transform.Translate (new Vector3 (0, 0, 1));
}
if (Input.GetKeyDown (KeyCode.DownArrow)) {
transform.Translate (new Vector3 (0, 0, -1));
}
解决方案实际上取决于您如何设置关卡。
如果一切都在同一条车道上,那么修改精灵渲染器的排序顺序可以为您提供解决方案。 检查精灵渲染器文档: https://docs.unity3d.com/Manual/class-SpriteRenderer.html
挑战来了,如果所有东西都在不同的层上。我所说的层是指您提供精灵渲染器的排序层。这会产生一些有趣的结果,因为仅仅修改排序顺序是不够的,您还必须更改图层。如果我没记错的话,您将在项目设置中将图层更改为它上面的图层。如果一切都在同一层上,那么更改排序顺序就足够了。
不要忘记考虑碰撞检测的潜在问题,因为更改游戏对象的车道意味着您可能必须将其物理层更改为,这样碰撞体就不会碰到任何东西层在前面。 https://docs.unity3d.com/Manual/LayerBasedCollision.html
希望这能引导您朝着正确的方向前进。