2D游戏中遮挡实现--记录

       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;
    }
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值