154 lines
4.0 KiB
C#
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
|
|
}
|
|
}
|