你好,
我想让激光始终从当前位置开始,我有一個空的游戏物体在那里决定激光开始的地方,還有处理线条绘制。
这是代码:
private void UpdateLaser(bool active, Color color = default)
{
if (laserRenderer == null) return;
laserRenderer.enabled = active;
if (!active) return;
laserRenderer.startColor = color;
laserRenderer.endColor = color;
laserRenderer.startWidth = laserWidth;
laserRenderer.endWidth = laserWidth;
if (shootingPoint != null)
{
// 确保激光始终从射击点的位置开始
laserRenderer.SetPosition(0, shootingPoint.position);
Vector3 targetPos = PlayerReference.Instance.position + playerTargetOffset;
Vector3 direction = (targetPos - shootingPoint.position).normalized;
// 发射激光线
RaycastHit[] hits = Physics.RaycastAll(shootingPoint.position, direction, detectionRange);
float closestDist = detectionRange;
Vector3 endPoint = shootingPoint.position + direction * detectionRange;
foreach (var hit in hits)
{
// 忽略这次小Boss的直系碰撞
if (hit.transform.root == transform.root) continue;
if (hit.distance < closestDist)
{
closestDist = hit.distance;
endPoint = hit.point;
}
}
// 最终设置激光线的位置
if (!active) return;
laserRenderer.SetPosition(1, endPoint);
}
}
private void SetupLaser()
{
// 找到 LineRenderer 组件
if (laserRenderer == null && shootingPoint != null)
{
laserRenderer = shootingPoint.GetComponent<LineRenderer>();
}
if (laserRenderer == null)
{
GameObject targetObj = (shootingPoint != null) ? shootingPoint.gameObject : gameObject;
laserRenderer = targetObj.GetComponent<LineRenderer>();
if (laserRenderer == null) laserRenderer = targetObj.AddComponent<LineRenderer>();
}
// 设置线条绘制属性
laserRenderer.startWidth = laserWidth;
laserRenderer.endWidth = laserWidth;
laserRenderer.positionCount = 2;
laserRenderer.enabled = false;
laserRenderer.useWorldSpace = true;
// 设置Shader
Shader particleShader = Shader.Find("Universal Render Pipeline/Particles/Unlit");
if (particleShader != null)
{
laserRenderer.material = new Material(particleShader);
}
else
{
laserRenderer.material = new Material(Shader.Find("Sprites/Default"));
}
}
评论 (0)