Unity에서 레일(경로) 당기기
레일
패스라고도 한다.
적이나 물체의 이동에 사용한다.
Rail on Unity
대략 조사해 보았더니, 심플한 레일이 없을 것 같다. (있는 경우 알려주세요!)
커스텀 에디터의 공부가 굳이 만들어 보았다.
스크린샷
사양
대략 조사해 보았더니, 심플한 레일이 없을 것 같다. (있는 경우 알려주세요!)
커스텀 에디터의 공부가 굳이 만들어 보았다.
스크린샷
사양
소스 코드
가장 중요한 것은 Assets/Scripts/Rail.cs입니다.
커스텀 에디터와 ReorderableList 를 사용해 레일 점의 추가, 삭제를 할 수 있게 되어 있습니다.
Rail.csusing System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
public class Rail : MonoBehaviour {
// 閉じる
public bool isClose = false;
// レール点のリスト
public List<GameObject> railPoints = new List<GameObject>();
//----
// アクセサ
//----
// レール点の数を取得する
public int getRailPointNum()
{
return railPoints.Count;
}
// レール点を取得する
public GameObject getRailPoint( int i )
{
Debug.Assert (railPoints.Count > 0);
return railPoints [i];
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnDrawGizmos() {
for( int i = 0, n = railPoints.Count; i < n; ++i ) {
if (i == n - 1 && !isClose) {
break;
}
GameObject from = railPoints [i];
GameObject to = railPoints [(i + 1) % n];
Gizmos.color = Color.green;
Gizmos.DrawLine (from.transform.position, to.transform.position);
}
}
// レールのカスタムエディタ
[CustomEditor(typeof(Rail))]
public class RailEditor : Editor
{
ReorderableList railPointsReorderableList;
private Rail rail
{
get
{
return target as Rail;
}
}
void OnEnable()
{
railPointsReorderableList = new ReorderableList (serializedObject, serializedObject.FindProperty ("railPoints"));
// コールバック設定
railPointsReorderableList.onAddCallback += AddRailPoint;
railPointsReorderableList.onRemoveCallback += RemoveRailPoint;
}
public override void OnInspectorGUI()
{
DrawDefaultInspector ();
serializedObject.Update ();
railPointsReorderableList.DoLayoutList ();
serializedObject.ApplyModifiedProperties ();
}
// レール点を追加する
private void AddRailPoint(ReorderableList list)
{
// レール点の生成位置
Vector3 position;
{
// 最初のレール点 ⇒ レールの位置
if (rail.railPoints.Count == 0)
{
position = rail.transform.position;
}
// 既にレール点がある ⇒ 最後のレール点の位置
else
{
GameObject railPoint_Last = rail.railPoints [rail.railPoints.Count - 1];
position = railPoint_Last.transform.position;
}
}
// レール点生成
GameObject prefab = (GameObject)Resources.Load ("Prefabs/RailPoint");
GameObject railPoint_New = Instantiate (prefab, position, Quaternion.identity);
// リストに追加
rail.railPoints.Add (railPoint_New);
// レールの子にする
railPoint_New.transform.parent = rail.transform;
}
// レール点を削除する
private void RemoveRailPoint(ReorderableList list)
{
GameObject railPoint = rail.railPoints [list.index];
rail.railPoints.Remove (railPoint);
DestroyImmediate (railPoint);
}
}
}
Reference
이 문제에 관하여(Unity에서 레일(경로) 당기기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/keitanxkeitan/items/f93dd48245bfbc64d0e5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
public class Rail : MonoBehaviour {
// 閉じる
public bool isClose = false;
// レール点のリスト
public List<GameObject> railPoints = new List<GameObject>();
//----
// アクセサ
//----
// レール点の数を取得する
public int getRailPointNum()
{
return railPoints.Count;
}
// レール点を取得する
public GameObject getRailPoint( int i )
{
Debug.Assert (railPoints.Count > 0);
return railPoints [i];
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnDrawGizmos() {
for( int i = 0, n = railPoints.Count; i < n; ++i ) {
if (i == n - 1 && !isClose) {
break;
}
GameObject from = railPoints [i];
GameObject to = railPoints [(i + 1) % n];
Gizmos.color = Color.green;
Gizmos.DrawLine (from.transform.position, to.transform.position);
}
}
// レールのカスタムエディタ
[CustomEditor(typeof(Rail))]
public class RailEditor : Editor
{
ReorderableList railPointsReorderableList;
private Rail rail
{
get
{
return target as Rail;
}
}
void OnEnable()
{
railPointsReorderableList = new ReorderableList (serializedObject, serializedObject.FindProperty ("railPoints"));
// コールバック設定
railPointsReorderableList.onAddCallback += AddRailPoint;
railPointsReorderableList.onRemoveCallback += RemoveRailPoint;
}
public override void OnInspectorGUI()
{
DrawDefaultInspector ();
serializedObject.Update ();
railPointsReorderableList.DoLayoutList ();
serializedObject.ApplyModifiedProperties ();
}
// レール点を追加する
private void AddRailPoint(ReorderableList list)
{
// レール点の生成位置
Vector3 position;
{
// 最初のレール点 ⇒ レールの位置
if (rail.railPoints.Count == 0)
{
position = rail.transform.position;
}
// 既にレール点がある ⇒ 最後のレール点の位置
else
{
GameObject railPoint_Last = rail.railPoints [rail.railPoints.Count - 1];
position = railPoint_Last.transform.position;
}
}
// レール点生成
GameObject prefab = (GameObject)Resources.Load ("Prefabs/RailPoint");
GameObject railPoint_New = Instantiate (prefab, position, Quaternion.identity);
// リストに追加
rail.railPoints.Add (railPoint_New);
// レールの子にする
railPoint_New.transform.parent = rail.transform;
}
// レール点を削除する
private void RemoveRailPoint(ReorderableList list)
{
GameObject railPoint = rail.railPoints [list.index];
rail.railPoints.Remove (railPoint);
DestroyImmediate (railPoint);
}
}
}
Reference
이 문제에 관하여(Unity에서 레일(경로) 당기기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/keitanxkeitan/items/f93dd48245bfbc64d0e5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)