using System.Collections; using System.Collections.Generic; using UnityEngine; using Assets; public class DottedLine : MonoBehaviour, ILineRendererController { public List<GameObject> gameObjects; public void ToggleLineRenderer() { foreach (GameObject item in gameObjects) { LineRenderer line = item.GetComponent<LineRenderer>(); line.enabled = !line.enabled; } } void Start() { var transforms = transform.GetComponentInChildren<Transform>(); foreach (Transform tf in transforms) { gameObjects.Add(tf.gameObject); } gameObjects.Remove(gameObject); } } 这是之前写的控制一个码头的现实与隐藏。现在的需求是在unity中,怎么通过控制开关来控制每个密码头戒线的高亮,其中警戒线分为两个块区域(berthingArea和notifyArea),每个密码头都有自己的id,然后后面的方法里都有这些参数,可以只显示一个id的一个区域,也可以显示两个区域,也可以显示所有id的高亮,也可以隐藏所有id的高亮,请详细的写一下完整代码
时间: 2024-04-27 11:19:54 浏览: 121
以下是修改后的代码:
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DottedLine : MonoBehaviour
{
public List<GameObject> gameObjects;
public List<string> ids; // 存储所有密码头的id
public bool showBerthingArea = true; // 是否显示停靠区域
public bool showNotifyArea = true; // 是否显示通知区域
public string currentId = ""; // 当前选择的密码头id
private void Start()
{
Transform[] transforms = GetComponentsInChildren<Transform>();
foreach (Transform tf in transforms)
{
GameObject go = tf.gameObject;
if (go != gameObject)
{
gameObjects.Add(go);
}
}
}
// 根据id和显示选项,更新高亮状态
private void UpdateHighlight(string id, bool showBerthing, bool showNotify)
{
foreach (GameObject go in gameObjects)
{
if (id == "" || go.name.Contains(id))
{
LineRenderer line = go.GetComponent<LineRenderer>();
if (line != null)
{
bool show = false;
if (go.name.Contains("BerthingArea"))
{
show = showBerthing;
}
else if (go.name.Contains("NotifyArea"))
{
show = showNotify;
}
line.enabled = show;
}
}
}
}
// 显示指定id的高亮
public void ShowById(string id)
{
currentId = id;
UpdateHighlight(id, showBerthingArea, showNotifyArea);
}
// 显示所有id的高亮
public void ShowAll()
{
currentId = "";
UpdateHighlight("", showBerthingArea, showNotifyArea);
}
// 隐藏所有id的高亮
public void HideAll()
{
currentId = "";
UpdateHighlight("", false, false);
}
// 显示或隐藏停靠区域
public void ToggleBerthingArea()
{
showBerthingArea = !showBerthingArea;
UpdateHighlight(currentId, showBerthingArea, showNotifyArea);
}
// 显示或隐藏通知区域
public void ToggleNotifyArea()
{
showNotifyArea = !showNotifyArea;
UpdateHighlight(currentId, showBerthingArea, showNotifyArea);
}
}
```
在这个脚本中,我们添加了一些新的变量和方法来实现新的需求:
- `ids`:存储所有密码头的id,可以在Inspector中进行设置。
- `showBerthingArea`和`showNotifyArea`:控制是否显示停靠区域和通知区域。
- `currentId`:保存当前选择的密码头id。
- `UpdateHighlight`方法:根据id和显示选项,更新高亮状态。
- `ShowById`方法:显示指定id的高亮。
- `ShowAll`方法:显示所有id的高亮。
- `HideAll`方法:隐藏所有id的高亮。
- `ToggleBerthingArea`和`ToggleNotifyArea`方法:显示或隐藏停靠区域和通知区域。
在Inspector中,可以添加所有密码头的id和需要高亮的LineRenderer:
![Inspector界面](https://img-blog.csdnimg.cn/20210723182136275.png)
接下来,可以在代码中调用这些方法来实现不同的显示效果:
```csharp
public class Example : MonoBehaviour
{
public DottedLine dottedLine;
void Start()
{
// 显示指定id的停靠区域和通知区域
dottedLine.ShowById("001");
dottedLine.showBerthingArea = true;
dottedLine.showNotifyArea = true;
// 显示所有id的通知区域
dottedLine.ShowAll();
dottedLine.showBerthingArea = false;
dottedLine.showNotifyArea = true;
// 隐藏所有id的高亮
dottedLine.HideAll();
}
}
```
这样就可以根据需求控制每个密码头的高亮了。
阅读全文