Files
TowerCraneVisualization/Assets/LRC/Scripts/TowerCrane/TowerAreaSampleController.cs

154 lines
4.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using DDDInducator.Runtime;
using DDDInducator.Runtime.Type;
using UnityEngine;
using UnityEngine.Serialization;
namespace LRC
{
/// <summary>
/// 塔机范围指示器
/// </summary>
public class TowerAreaSampleController : MonoBehaviour
{
#region
[SerializeField]
private TowerCraneControlManager _tower;
/// <summary>
/// 关注的塔机索引
/// </summary>
private int watchTargetIndex = -1;
public TowerCraneControlManager WatchedTowerTarget
{
get => _tower.ProximityTowers[watchTargetIndex];
}
/// <summary>
/// 主要的材质目标
/// </summary>
public Material MainAreaMaterial;
public Color ConflictingColors = Color.black;
public Color SelectColor => new Color(66f / 255, 185f / 255, 1, 238f / 255);
public Color IntersectionColor => new Color(0, 126f / 255, 1, 200f / 255);
public Color DefualtColor => new Color(116f / 255, 116f / 255, 116f / 255, 200f / 255);
public Color LineSelectColor => new Color(0, 200f / 255, 200f / 255);
public Color LineDefualtColor => new Color(200f / 255, 200f / 255, 200f / 255);
#endregion
#region
public void Awake()
{
MainAreaMaterial = GetComponent<MeshRenderer>()?.material;
ConflictingColors = IntersectionColor;
SetSelect(false);
}
public void Update()
{
SetArea();
var level = 0;
if (watchTargetIndex >= 0)
{
var target = _tower.RegulatoryList
.OfType<TowerInvadeCap>()
.FirstOrDefault(a => a.otherTower == WatchedTowerTarget);
level = (int)target.TerminalLevel();
}
else
{
foreach (var target in _tower.RegulatoryList
.OfType<TowerInvadeCap>())
level = Mathf.Max(level, (int)target.TerminalLevel());
}
//IntersectionColor
ConflictingColors = level == 0 ?
new Color(0,0,0,0) :
((WarningLevel)level + 1).LevelColor(alpha:0.6f);
MainAreaMaterial.SetColor("_IntersectionColor", ConflictingColors);
}
#endregion
#region
public void Initialized(TowerCraneControlManager tower, int watchTowerIndex = -1)
{
_tower = tower;
watchTargetIndex = watchTowerIndex;
}
private void SetArea()
{
MainAreaMaterial
.SetFloat("_Enable", 1);
MainAreaMaterial
.SetFloat("_Range_Main", _tower.RockerArmAbsRange);
Func<TowerCraneControlManager, Vector3> getTowerLocalInfluenceWorldSpacePoint = a =>
(Quaternion.Inverse(transform.rotation) * (a.transform.position - transform.position)) +
transform.position;
Action<int, Vector3, float> setArea = (Index, pos, range) =>
{
MainAreaMaterial.SetVector($"_Pos_{Index}", pos);
MainAreaMaterial.SetFloat($"_Range_{Index}", range);
};
if (watchTargetIndex >= 0)
goto SignTower;
TowerCraneControlManager targetTower = null;
for (int i = 0; i < TowerCraneControlManager.MaxProximityTowerCount; i++)
{
var readCount = i + 1;
var isvalid = i < _tower.ProximityTowers.Count;
if (isvalid)
targetTower = _tower.ProximityTowers[i];
setArea(readCount,
isvalid ? getTowerLocalInfluenceWorldSpacePoint(targetTower) : Vector3.zero,
isvalid ? targetTower.RockerArmAbsRange : -1);
}
return;
SignTower:
setArea(1,
getTowerLocalInfluenceWorldSpacePoint(WatchedTowerTarget),
WatchedTowerTarget.RockerArmAbsRange);
}
public void SetSelect(bool isSelect)
{
var color = isSelect ? SelectColor : DefualtColor;
var intercolor = isSelect ? ConflictingColors : DefualtColor;
var linecolor = isSelect ? LineSelectColor : LineDefualtColor;
MainAreaMaterial
.SetColor("_ContentColor", new Color(0,0,0,0));
MainAreaMaterial
.SetColor("_ContentColor2", new Color(0,0,0,0));
MainAreaMaterial
.SetColor("_IntersectionColor", intercolor);
MainAreaMaterial
.SetColor("_LineColor", linecolor);
if(isSelect)
transform.localPosition = new Vector3 (0,0.01f,0);
else
transform.localPosition = Vector3.zero;
}
#endregion
}
}