2D横版游戏人物移动中,人在树上边,应该树挡住人物,相反人在树下应该人物挡住树,这时应该editor--projectSetting--graphicsSettings,将Transparency sort mode设置为custom Axis,Transparency sort Axis的Y设置为1,这就表示当人物和树的Y轴相差1时会自动设置排序。
注意:参与自动排序的对象的深度都应该是一致的。
第二种:项目自用
private void GenerateMap()
{
int height = mapData[0].height;
int width = mapData[0].width;
for (int i = 0; i < mapData.Length; i++)
{
for (int x = 0; x < mapData[i].width; x++)
{
for (int y = 0; y < mapData[i].height; y++)
{
Color c = mapData[i].GetPixel(x, y);
MapElement newElement = Array.Find(mapElements, e => e.MyColor == c);
if (newElement != null)
{
float xPos = worldStartPos.x + (defaultTile.bounds.size.x * x);
float yPos = worldStartPos.y + (defaultTile.bounds.size.y * y);
GameObject go = Instantiate(newElement.MyElementPrefab);
go.transform.position = new Vector3(xPos, yPos, 0);
if (newElement.MyTileTag == "Tree")
{
go.GetComponent<SpriteRenderer>().sortingOrder = height * 2 - y * 2;
}
go.transform.parent = map;
}
}
}
}
}
/****************************************************
文件:LayerSorter.cs
功能:层排序
*****************************************************/
using UnityEngine;
using System.Collections.Generic;
public class LayerSorter : MonoBehaviour
{
private SpriteRenderer parentRender;
List<Obstacle> obstacles = new List<Obstacle>();
private void Start()
{
parentRender = transform.parent.GetComponent<SpriteRenderer>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Obstacle")
{
Obstacle o = collision.GetComponent<Obstacle>();
o.Fadeout();
if (obstacles.Count == 0||o.MySpriteRenderer.sortingOrder-1< parentRender.sortingOrder)
{
parentRender.sortingOrder = o.MySpriteRenderer.sortingOrder - 1;
}
obstacles.Add(o);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.tag == "Obstacle")
{
Obstacle o = collision.GetComponent<Obstacle>();
o.FadeIn();
obstacles.Remove(o);
if (obstacles.Count == 0)
{
parentRender.sortingOrder = 200;
}
else
{
obstacles.Sort();
parentRender.sortingOrder = obstacles[0].MySpriteRenderer.sortingOrder - 1;
}
}
}
}
/****************************************************
文件:Abstacle.cs
功能:障碍
*****************************************************/
using System;
using UnityEngine;
public class Obstacle : MonoBehaviour, IComparable<Obstacle>
{
public SpriteRenderer MySpriteRenderer { get; set; }
private Color defaultColor;
private Color fadedColor;
public int CompareTo(Obstacle other)
{
if (MySpriteRenderer.sortingOrder > other.MySpriteRenderer.sortingOrder)
{
return 1;
}
else if (MySpriteRenderer.sortingOrder < other.MySpriteRenderer.sortingOrder)
{
return -1;
}
return 0;
}
private void Start()
{
MySpriteRenderer = GetComponent<SpriteRenderer>();
defaultColor = MySpriteRenderer.color;
fadedColor = defaultColor;
fadedColor.a = 0.7f;
}
public void FadeIn()
{
MySpriteRenderer.color = defaultColor;
}
public void Fadeout()
{
MySpriteRenderer.color = fadedColor;
}
}