W298.dev
ProjectsPostsAbout Me
youtube
Pages
ProjectsPostsAbout Me
Posts
TAGS
All
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape
Assembly Definition
ML-Agent
RL-Obstacle-Avoid
RL-Competitive
Unity
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape
Assembly Definition
SERIES
RL-Obstacle-Avoid
RL-Competitive
Robot-Escape

Laser Pointer

Demonstration

https://velog.velcdn.com/images/lutca1320/post/78939c54-8072-46ff-9866-cbf770100b80/image.gif
위처럼 레이저 포인터를 구현할 것이다. LineRenderer 를 이용해 구현할 것이다.

Line Renderer

https://velog.velcdn.com/images/lutca1320/post/8674e5da-1dc9-4eaf-bf16-7d737ea59155/image.png
Laser Prefab 을 따로 만들어서 Line Renderer 와 LaserRenderer 스크립트를 추가했다.
  • LaserRenderer 의 내용은 별 거 없다. start, end 값을 설정해주면 LineRenderer 의 Position 값을 변경해준다.
  • OnEnable OnDisable 을 통해 자신이 Enable / Disable 되었을 때 LineRenderer 도 같이 적용되게 하였다.
1public class LaserRenderer : MonoBehaviour
2{
3	public Vector3 start;
4	public Vector3 end;
5
6	private LineRenderer laserLine;
7
8	void Start()
9	{
10		laserLine = GetComponent<LineRenderer>();
11	}
12
13	void Update()
14	{
15		laserLine.SetPosition(0, start);
16		laserLine.SetPosition(1, end);
17	}
18
19	private void OnEnable()
20	{
21		if (!laserLine) return;
22		laserLine.enabled = true;
23	}
24	private void OnDisable()
25	{
26        if (!laserLine) return;
27        laserLine.enabled = false;
28	}
29}
30
start, end 값 설정은 RobotAimController 에서 진행한다.
1public class RobotAimController : MonoBehaviour
2{
3    private LaserRenderer laserRenderer;
4    ...
5
6    public Transform laserStartPoint;
7
8    void Start()
9    {
10        laserRenderer = transform.root.gameObject.GetComponentInChildren<LaserRenderer>();
11        ...
12    }
13
14    void FixedUpdate()
15    {
16        ...
17
18        laserRenderer.enabled = inputHandler.isAim;
19        laserRenderer.start = laserStartPoint.position;
20        laserRenderer.end = laserRenderer.start + laserStartPoint.forward * 100;
21
22        Ray laserRay = new Ray(laserRenderer.start, laserStartPoint.forward);
23        Physics.Raycast(laserRay, out RaycastHit laserHit, 100);
24        if (laserHit.collider)
25        {
26            laserRenderer.end = laserHit.point;
27        }
28    }
29}
30
Physics.Raycast 를 이용해 Hit 된 곳을 end 값으로 지정한다.
  • start 값은 총기 모델의 laserStart Transform 값을 사용했다.
  • laserStartPoint.forward 을 Direction 으로 사용해 총기의 Rotation 에 따라 바뀐 Direction 으로 직진하게 만들었다.
(↓ 총기 Rotation 이 바뀌어도 총기 방향이랑 평행하게 직진한다. )
https://velog.velcdn.com/images/lutca1320/post/a922c8cf-410e-442d-ae86-41d8cf91c20c/image.png