#62 - Overhead Lines for Character Unity
Date: 2019-05-25 12:00 - c#
Displays lines over an object in Unity. You need to setup a line prefab which is a game object with a RawImage and Text to make this work.
// OverHeadLines.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public partial class OverHeadLines : MonoBehaviour {
	public GameObject overHeadLinePrefab;
	[SerializeField]
	private List<Line> _lines = new List<Line>();
	public List<Line> Lines {
		get { return _lines; }
	}
	void Start () {
		ForceRebuildLines();
	}
	public Line AddLine(Line line) {
		_lines.Add(line);
		ForceRebuildLines();
		return line;
	}
	public void RemoveLine(Line line) {
		int index = _lines.IndexOf(line);
		if (index != -1) {
			Destroy(transform.GetChild(index).gameObject);
			_lines.RemoveAt(index);
		}
	}
	public void RebuildLine(Line line) {
		int index = _lines.IndexOf(line);
		if (index != -1) {
			UpdateLineObject(transform.GetChild(index).gameObject, line);
		}
	}
	public void ForceRebuildLines() {
		_lines.Sort();
		for (int i = transform.childCount - 1; i >= 0; i--)
			Destroy(transform.GetChild(i).gameObject);
		foreach (Line line in _lines) {
			GameObject lineObj = GameObject.Instantiate(overHeadLinePrefab, transform);
			UpdateLineObject(lineObj, line);
		}
	}
	private void UpdateLineObject(GameObject lineObj, Line line) {
		RawImage lineImage = lineObj.GetComponentInChildren<RawImage>();
		Text lineText = lineObj.GetComponentInChildren<Text>();
		lineImage.gameObject.SetActive(line.icon != null);
		lineImage.texture = line.icon;
		lineText.text = line.text;
		LayoutRebuilder.ForceRebuildLayoutImmediate(lineObj.GetComponent<RectTransform>());
	}
}
// Line.cs
using System;
using UnityEngine;
[Serializable]
public class Line : IComparable {
    public Texture icon;
    public String text;
    public int priority;
    public Line(String text, int priority = 0) : this(null, text, priority) {
    }
    public Line(Texture icon, String text, int priority = 0) {
        this.text = text;
        this.icon = icon;
        this.priority = priority;
    }
    public int CompareTo(object obj) {
        Line other = (Line)obj;
        return other.priority - priority;
    }
}
