Commit f5a09f33 authored by Chae Ho Shin's avatar Chae Ho Shin

Merge branch 'ui' into collision-model

parents 08c6c35c 748a100c
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using System.Linq; using System.Linq;
using UnityEngine.UI; using UnityEngine.UI;
using System; using System;
using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double;
public class PathRenderer : MonoBehaviour public class PathRenderer : MonoBehaviour
{ {
[SerializeField] [SerializeField]
Square square; Square square;
[SerializeField] [SerializeField]
GameObject PathColliderPrefab; GameObject PathColliderPrefab;
[SerializeField] [SerializeField]
Camera playercamera; Camera playercamera;
[SerializeField] [SerializeField]
LevelManager levelManager; LevelManager levelManager;
[SerializeField] [SerializeField]
BackgroundMovement background; BackgroundMovement background;
[SerializeField] [SerializeField]
LogScaleSlider velocityslider; LogScaleSlider velocityslider;
[SerializeField] [SerializeField]
UIManager ui; UIManager ui;
LineRenderer _pathRenderer; LineRenderer _pathRenderer;
float _originalPathColliderY; float _originalPathColliderY;
public BackgroundMovement Background public BackgroundMovement Background
{ {
get get
{ {
return background; return background;
} }
set set
{ {
background = value; background = value;
} }
} }
// Start is called before the first frame update // Start is called before the first frame update
void Start() void Start()
{ {
_originalPathColliderY = PathColliderPrefab.transform.localScale.y / 2; _originalPathColliderY = PathColliderPrefab.transform.localScale.y / 2;
_pathRenderer = GetComponent<LineRenderer>(); _pathRenderer = GetComponent<LineRenderer>();
_ResetPaths(); _ResetPaths();
} }
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
if (Input.GetMouseButtonDown(1) && levelManager.player.isInertial()) if (Input.GetMouseButtonDown(1) && levelManager.player.isInertial())
{ {
RaycastHit hit1; RaycastHit hit1;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition); var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit1)) if (Physics.Raycast(ray, out hit1))
{ {
RaycastHit hit2; RaycastHit hit2;
ray = playercamera.ViewportPointToRay(hit1.textureCoord); ray = playercamera.ViewportPointToRay(hit1.textureCoord);
if (Physics.Raycast(ray, out hit2)) if (Physics.Raycast(ray, out hit2))
{ {
if (Input.GetKey(KeyCode.LeftShift)) if (Input.GetKey(KeyCode.LeftShift))
{ {
_DrawMorePath(hit2.point, hit1); _DrawMorePath(hit2.point, hit1);
} }
else else
{ {
_DrawOnePath(hit2.point, hit1); _DrawOnePath(hit2.point, hit1);
} }
} }
} }
/*if (Physics.Raycast(ray, out hit)) /*if (Physics.Raycast(ray, out hit))
{ {
if (Input.GetKey(KeyCode.LeftShift)) if (Input.GetKey(KeyCode.LeftShift))
{ {
_DrawMorePath(hit.point); _DrawMorePath(hit.point);
} }
else else
{ {
_DrawOnePath(hit.point); _DrawOnePath(hit.point);
} }
}*/ }*/
} }
} }
private void _DrawOnePath(Vector3 point, RaycastHit hit) private void _DrawOnePath(Vector3 point, RaycastHit hit)
{ {
_ResetPaths(); _ResetPaths();
square.pathList[0] = transform.localPosition; square.pathList[0] = transform.localPosition;
square.pathVelocity[0] = 0.0f; square.pathVelocity[0] = 0.0f;
var tmp = transform.InverseTransformPoint(point); var tmp = transform.InverseTransformPoint(point);
square.pathList.Add(new Vector3(tmp.x, tmp.y, 0.0f)); square.pathList.Add(new Vector3(tmp.x, tmp.y, 0.0f));
square.pathVelocity.Add(velocityslider.GetLogScaleValue()); square.pathVelocity.Add(velocityslider.GetLogScaleValue());
_pathRenderer.positionCount = square.pathList.Count(); _pathRenderer.positionCount = square.pathList.Count();
_pathRenderer.SetPositions(square.pathList.ToArray()); _pathRenderer.SetPositions(square.pathList.ToArray());
_InstantiatePathCollider(0); _InstantiatePathCollider(0);
ui.PopupLastPathUI(_pathRenderer.positionCount - 2, hit); ui.PopupLastPathUI(_pathRenderer.positionCount - 2, hit);
} }
private void _ResetPaths() private void _ResetPaths()
{ {
_pathRenderer.positionCount = 1; _pathRenderer.positionCount = 1;
square.pathList.Clear(); square.pathList.Clear();
square.pathVelocity.Clear(); square.pathVelocity.Clear();
square.pathList.Add(transform.localPosition); square.pathList.Add(transform.localPosition);
square.pathVelocity.Add(0.0f); square.pathVelocity.Add(0.0f);
_pathRenderer.SetPositions(square.pathList.ToArray()); _pathRenderer.SetPositions(square.pathList.ToArray());
for (int i = 0; i < transform.childCount; i++) for (int i = 0; i < transform.childCount; i++)
{ {
Destroy(transform.GetChild(i).gameObject); Destroy(transform.GetChild(i).gameObject);
} }
} }
private void _DrawMorePath(Vector3 point, RaycastHit hit) private void _DrawMorePath(Vector3 point, RaycastHit hit)
{ {
if (square.pathList.Count == 0) if (square.pathList.Count == 0)
{ {
_DrawOnePath(point, hit); _DrawOnePath(point, hit);
} }
else else
{ {
var tmp = transform.InverseTransformPoint(point); var tmp = transform.InverseTransformPoint(point);
square.pathList.Add(new Vector3(tmp.x, tmp.y, 0.0f)); square.pathList.Add(new Vector3(tmp.x, tmp.y, 0.0f));
square.pathVelocity.Add(velocityslider.GetLogScaleValue()); square.pathVelocity.Add(velocityslider.GetLogScaleValue());
_pathRenderer.positionCount = square.pathList.Count(); _pathRenderer.positionCount = square.pathList.Count();
_pathRenderer.SetPositions(square.pathList.ToArray()); _pathRenderer.SetPositions(square.pathList.ToArray());
_InstantiatePathCollider(square.pathList.Count() - 2); _InstantiatePathCollider(square.pathList.Count() - 2);
ui.PopupLastPathUI(_pathRenderer.positionCount - 2, hit); ui.PopupLastPathUI(_pathRenderer.positionCount - 2, hit);
} }
} }
public void PathClear() public void PathClear()
{ {
_ResetPaths(); _ResetPaths();
} }
/// <summary> /// <summary>
/// 현재 설정된 경로를 반환. /// 현재 설정된 경로를 반환.
/// 0번은 내 위치 /// 0번은 내 위치
/// x y 가 공간 z 가 시간 /// x y 가 공간 z 가 시간
/// </summary> /// </summary>
public List<Vector3> PathPositionsXY public List<Vector3> PathPositionsXY
{ {
get get
{ {
return square.pathList; return square.pathList;
} }
} }
/// <summary> /// <summary>
/// 현재 설정된 경로를 반환. /// 현재 설정된 경로를 반환.
/// 0번은 현재위치 //패트롤 고려 /// 0번은 현재위치 //패트롤 고려
/// x z 가 공간 y 가 시간 /// x z 가 공간 y 가 시간
/// </summary> /// </summary>
public List<Vector3> PathPositionsXZ public List<Vector3> PathPositionsXZ
{ {
get get
{ {
List<Vector3> list = new List<Vector3>(); List<Vector3> list = new List<Vector3>();
foreach (var a in square.pathList) foreach (var a in square.pathList)
{ {
//xy -> xz //xy -> xz
list.Add(new Vector3(a.x, 0, a.y)); list.Add(new Vector3(a.x, 0, a.y));
} }
return list; return list;
} }
} }
/// <summary> /// <summary>
/// 현재 설정된 경로의 속력을 반환. /// 현재 설정된 경로의 속력을 반환.
/// 0번은 0.0f /// 0번은 0.0f
/// </summary> /// </summary>
public List<float> PathVelocities public List<float> PathVelocities
{ {
get get
{ {
return new List<float>(square.pathVelocity); return new List<float>(square.pathVelocity);
} }
} }
private void _InstantiatePathCollider(int n) private void _InstantiatePathCollider(int n)
{ {
var _pathCollider = Instantiate(PathColliderPrefab, transform); var _pathCollider = Instantiate(PathColliderPrefab, transform);
_pathCollider.name = "PathCollider-" + n; _pathCollider.name = "PathCollider-" + n;
_pathCollider.tag = "path"; _pathCollider.tag = "path";
_pathCollider.transform.localScale = new Vector3(0.1f, _originalPathColliderY, 0); _pathCollider.transform.localScale = new Vector3(0.1f, _originalPathColliderY, 0);
_pathCollider.transform.localEulerAngles = new Vector3(0, 0, _pathCollider.transform.localEulerAngles = new Vector3(0, 0,
(float)Constants.RadianToDegree(Mathf.PI / 2 + (float)Constants.RadianToDegree(Mathf.PI / 2 +
Mathf.Atan Mathf.Atan
(square.GetTangent( (square.GetTangent(
square.GetNthPath(n))))); square.GetNthPath(n)))));
float _newY = square.GetNthPath(n).magnitude; float _newY = square.GetNthPath(n).magnitude;
_pathCollider.transform.localScale = new Vector3(0.1f, _newY * _originalPathColliderY, 0); _pathCollider.transform.localScale = new Vector3(0.1f, _newY * _originalPathColliderY, 0);
_pathCollider.transform.localPosition = (square.pathList[n] + square.pathList[n + 1]) / 2; _pathCollider.transform.localPosition = (square.pathList[n] + square.pathList[n + 1]) / 2;
} }
public IEnumerator _StartMovingPath(int finalPathNum) public IEnumerator _StartMovingPath(int finalPathNum)
{ {
int i = 0; int i = 0;
var u = levelManager.player.v; var u = levelManager.player.v;
int tinterval = Constants.alphatinterval; int tinterval = Constants.alphatinterval;
VectorBuilder<double> V = Vector<double>.Build; VectorBuilder<double> V = Vector<double>.Build;
while (i <= finalPathNum) //square.PathList에서 0에서 시작해 finalPathNum까지 이동
{
Vector3 startpos = new Vector3(levelManager.player.transform.position.x, 0, levelManager.player.transform.position.z); var startPosition = levelManager.player.transform.position;
Vector3 dest = new Vector3(square.GetNthPath(i).x, 0f, square.GetNthPath(i).y); Debug.Log(startPosition + "test");
Vector3 acceleration = dest.normalized;
while (i <= finalPathNum)
var v = square.GetPathVelocity(i); {
Vector3 startpos = new Vector3(levelManager.player.transform.position.x, 0, levelManager.player.transform.position.z); // 경로 이동 시작할때 위치
var atmp = (float)(v * Constants.c); Vector3 dest = new Vector3(square.GetNthPath(i).x, 0f, square.GetNthPath(i).y); // 시작 관성계 기준 startpos에서 목표지점까지 공간 좌표
Vector3 acceleration = dest.normalized;
double[] vtmp = { (atmp * (acceleration.x / acceleration.magnitude)), 0.0, (atmp * (acceleration.z / acceleration.magnitude)) };
double[] xtmp = { dest.magnitude / (v), dest.x, dest.z }; var v = square.GetPathVelocity(i);
var deltavnaive = V.DenseOfArray(vtmp);
var deltaxnaive = V.DenseOfArray(xtmp); var atmp = (float)(v * Constants.c);
double[] tmp = {Constants.c * Constants.Gamma(deltavnaive.L2Norm()), double[] vtmp = { (atmp * (acceleration.x / acceleration.magnitude)), 0.0, (atmp * (acceleration.z / acceleration.magnitude)) };
deltavnaive[0] * Constants.Gamma(deltavnaive.L2Norm()), double[] xtmp = { dest.magnitude / (v), dest.x, dest.z };
deltavnaive[2] * Constants.Gamma(deltavnaive.L2Norm())}; var deltavnaive = V.DenseOfArray(vtmp);
var deltaxnaive = V.DenseOfArray(xtmp);
var deltav = V.DenseOfArray(tmp);
double[] tmp = {Constants.c * Constants.Gamma(deltavnaive.L2Norm()),
Vector<double> deltax = deltaxnaive; deltavnaive[0] * Constants.Gamma(deltavnaive.L2Norm()),
deltavnaive[2] * Constants.Gamma(deltavnaive.L2Norm())};
if (u.magnitude > 0.0f)
{ var deltav = V.DenseOfArray(tmp);
deltav = Constants.BoostMatrix(-u) * deltav;
deltax = Constants.BoostMatrix(-u) * deltaxnaive; Vector<double> deltax = deltaxnaive;
}
if (u.magnitude > 0.0f)
var tt = deltav[0] / Constants.c; {
deltav = Constants.BoostMatrix(-u) * deltav; // 로렌츠 행렬을 곱해서 경로 이동시 속도가 월드 관성계에서 무슨 속도인지 구함(deltav)
Vector3 finaldeltav = new Vector3((float)(deltav[1] / tt), 0.0f, (float)(deltav[2] / tt)); deltax = Constants.BoostMatrix(-u) * deltaxnaive; // 로렌츠 행렬을 곱해서 경로 이동시 위치 변화가 월드 관성계에서 얼마나 되는지 구함(deltax)
Vector3 finaldeltax = new Vector3((float)deltax[1], 0.0f, (float)deltax[2]); }
levelManager.player.v = finaldeltav; var tt = deltav[0] / Constants.c;
while (true) Vector3 finaldeltav = new Vector3((float)(deltav[1] / tt), 0.0f, (float)(deltav[2] / tt));
{ Vector3 finaldeltax = new Vector3((float)deltax[1], 0.0f, (float)deltax[2]);
var currentpos = new Vector3(levelManager.player.transform.position.x, 0, levelManager.player.transform.position.z);
var traveledpos = currentpos - startpos; levelManager.player.v = finaldeltav; // 플레이어 월드 관성계 기준 속도를 deltav로 세팅
if (traveledpos.magnitude >= finaldeltax.magnitude)
{ while (true)
break; {
} var currentpos = new Vector3(levelManager.player.transform.position.x, 0, levelManager.player.transform.position.z);
yield return new WaitForFixedUpdate(); var traveledpos = currentpos - startpos;
} if (traveledpos.magnitude >= finaldeltax.magnitude)
{
break;
levelManager.player.v = u; }
levelManager.player.transform.position = new Vector3(startpos.x + finaldeltax.x yield return new WaitForFixedUpdate();
, levelManager.player.transform.position.y }
, startpos.z + finaldeltax.z);
levelManager.player.v = u; // 원래 관성계로 돌아옴
levelManager.player.transform.position = new Vector3(startpos.x + finaldeltax.x
i++; , levelManager.player.transform.position.y
} , startpos.z + finaldeltax.z); // 위치 보정해줌(fixed update오차)
Background.Toggle = true;
} // INSERT CODE TO REMOVE PATH FROM PATH RENDERER HERE
// 여기에 방금 이동한 경로를 안보이게 해야 함
public void DeletePathsAfterNthPath(int n) HideNthPath(i);
{
square.pathList.RemoveRange(n, _pathRenderer.positionCount - n);
square.pathVelocity.RemoveRange(n, _pathRenderer.positionCount - n); i++;
for (int i = 0; i < transform.childCount; i++) }
{ Debug.Log(levelManager.player.transform.position + "test");
if (i + 1 >= n) Destroy(transform.GetChild(i).gameObject); shiftPath(finalPathNum + 1, levelManager.player.transform.position - startPosition);
} Background.Toggle = true;
_pathRenderer.positionCount = square.pathList.Count();
} //아마 여기에 이동을 다 마친 경로들을 square.pathList랑 square.pathVelocity에서 없애주고, finalPathNum 다음 경로가 square.pathList[1]이 되게 해야할듯
} // PathRenderer에 child로 되 있는 Path-n들 이름도 다 바꿔줘야 할꺼임(니가 최종 경로 가 몇번째인지 판정으로 GameObject 이름을 string으로 받아와서 하니까)
// 귀찮으면 아예 UIManager.cs에서 int pathNum = int.Parse(obj.name.Substring(13)); 이부분을 바꿔도 됨.
}
public void DeletePathsAfterNthPath(int n)
{
square.pathList.RemoveRange(n, _pathRenderer.positionCount - n);
square.pathVelocity.RemoveRange(n, _pathRenderer.positionCount - n);
for (int i = n - 1; i < transform.childCount; i++)
{
Destroy(transform.GetChild(i).gameObject);
}
_pathRenderer.positionCount = square.pathList.Count();
}
public void HideNthPath(int n)
{
transform.GetChild(n).gameObject.GetComponent<MeshRenderer>().enabled=false;
}
public void shiftPath(int times, Vector3 deltaPosition)
{
square.pathList.RemoveRange(1, times);
square.pathVelocity.RemoveRange(1, times);
deltaPosition = ui.getXYVectorfromXZVector(deltaPosition);
Debug.Log(deltaPosition + "test");
int i;
for (i = 0; i < times; i++)
{
Destroy(transform.GetChild(i).gameObject);
}
for (i = 0; i < transform.childCount - times; i++)
{
GameObject obj = transform.GetChild(i + times).gameObject;
obj.name = "PathCollider-" + i;
obj.transform.localPosition -= deltaPosition;
square.pathList[i + 1] -= deltaPosition;
}
_pathRenderer.positionCount = square.pathList.Count();
_pathRenderer.SetPositions(square.pathList.ToArray());
}
}
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
using System; using System;
using System.Linq; using System.Linq;
public class UIManager : MonoBehaviour public class UIManager : MonoBehaviour
{ {
[SerializeField] [SerializeField]
Square square; Square square;
[SerializeField] [SerializeField]
Camera playercamera; Camera playercamera;
[SerializeField] [SerializeField]
LogScaleSlider velocityslider; LogScaleSlider velocityslider;
[SerializeField] [SerializeField]
LogScaleSlider accelslider; LogScaleSlider accelslider;
[SerializeField] [SerializeField]
private Text interactText; private Text interactText;
public Canvas canvas; public Canvas canvas;
public Text mytime; public Text mytime;
//public Planemovement clock1; //public Planemovement clock1;
//public Planemovement clock2; //public Planemovement clock2;
//public Text clock1time; //public Text clock1time;
//public Text clock2time; //public Text clock2time;
public Text wintext; public Text wintext;
public GameObject _pathUI; public GameObject _pathUI;
public LevelManager levelManager; public LevelManager levelManager;
public PlayerMovement player; public PlayerMovement player;
public PathRenderer pathRenderer; public PathRenderer pathRenderer;
private int prevSelectPathNum = -1; private int prevSelectPathNum = -1;
private Text pathName; private Text pathName;
private Text pathVelocity; private Text pathVelocity;
private Vector3 middlePoint; private Vector3 middlePoint;
private Vector3 canvasSize; private Vector3 canvasSize;
private int sliderflag = 0; private int sliderflag = 0;
GraphicRaycaster gr; GraphicRaycaster gr;
PointerEventData ped; PointerEventData ped;
// Start is called before the first frame update // Start is called before the first frame update
void Start() void Start()
{ {
_pathUI.SetActive(false); _pathUI.SetActive(false);
pathName = _pathUI.transform.Find("Name").GetComponent<Text>(); pathName = _pathUI.transform.Find("Name").GetComponent<Text>();
pathVelocity = _pathUI.transform.Find("Velocity").GetComponent<Text>(); pathVelocity = _pathUI.transform.Find("Velocity").GetComponent<Text>();
middlePoint = _pathUI.transform.position; middlePoint = _pathUI.transform.position;
canvasSize = new Vector3(Screen.width, Screen.height, 0); canvasSize = new Vector3(Screen.width, Screen.height, 0);
gr = canvas.GetComponent<GraphicRaycaster>(); gr = canvas.GetComponent<GraphicRaycaster>();
ped = new PointerEventData(null); ped = new PointerEventData(null);
} }
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
mytime.text = levelManager.player.time.ToString() + " s"; mytime.text = levelManager.player.time.ToString() + " s";
//clock1time.text = clock1.GetTime().ToString() + " s"; //clock1time.text = clock1.GetTime().ToString() + " s";
//clock2time.text = clock2.GetTime().ToString() + " s"; //clock2time.text = clock2.GetTime().ToString() + " s";
if (levelManager.winstate) if (levelManager.winstate)
{ {
wintext.gameObject.SetActive(true); wintext.gameObject.SetActive(true);
} }
if (Input.GetMouseButtonDown(0)) if (Input.GetMouseButtonDown(0))
{ {
ped.position = Input.mousePosition; ped.position = Input.mousePosition;
List<RaycastResult> results = new List<RaycastResult>(); List<RaycastResult> results = new List<RaycastResult>();
gr.Raycast(ped, results); gr.Raycast(ped, results);
bool isIgnored = true; bool isIgnored = true;
//ui 클릭시. //ui 클릭시.
foreach (RaycastResult re in results) foreach (RaycastResult re in results)
{ {
GameObject obj = re.gameObject; GameObject obj = re.gameObject;
//panel만 있는지 검사. //panel만 있는지 검사.
isIgnored &= (obj.tag == "ignored"); isIgnored &= (obj.tag == "ignored");
//Debug.Log(obj); //Debug.Log(obj);
//슬라이더일때 //슬라이더일때
if (obj.tag == "VelocitySlider") if (obj.tag == "VelocitySlider")
{ {
sliderflag = 1; sliderflag = 1;
if (_pathUI.activeSelf == true && prevSelectPathNum != -1) if (_pathUI.activeSelf == true && prevSelectPathNum != -1)
{ {
square.pathVelocity[prevSelectPathNum + 1] = velocityslider.GetLogScaleValue(); square.pathVelocity[prevSelectPathNum + 1] = velocityslider.GetLogScaleValue();
pathVelocity.text = "Velocity: " + square.GetPathVelocity(prevSelectPathNum).ToString() + "c"; pathVelocity.text = "Velocity: " + square.GetPathVelocity(prevSelectPathNum).ToString() + "c";
break; break;
} }
} }
} }
if (isIgnored) if (isIgnored)
{ {
//클릭된 ui가 패널만 있을때. //클릭된 ui가 패널만 있을때.
TryFIndPath(); TryFIndPath();
} }
} }
else if (sliderflag == 1 && Input.GetMouseButton(0)) else if (sliderflag == 1 && Input.GetMouseButton(0))
{ {
if (_pathUI.activeSelf == true && prevSelectPathNum != -1) if (_pathUI.activeSelf == true && prevSelectPathNum != -1)
{ {
square.pathVelocity[prevSelectPathNum + 1] = velocityslider.GetLogScaleValue(); square.pathVelocity[prevSelectPathNum + 1] = velocityslider.GetLogScaleValue();
pathVelocity.text = "Velocity: " + square.GetPathVelocity(prevSelectPathNum).ToString() + "c"; pathVelocity.text = "Velocity: " + square.GetPathVelocity(prevSelectPathNum).ToString() + "c";
} }
} }
else if (Input.GetMouseButtonDown(1)) else if (Input.GetMouseButtonDown(1))
{ {
sliderflag = 0; sliderflag = 0;
} }
//player movement //player movement
if (Input.GetKeyDown("w")) if (Input.GetKeyDown("w"))
{ {
var tmp = accelslider.GetLogScaleValue() * (float)Constants.c; var tmp = accelslider.GetLogScaleValue() * (float)Constants.c;
levelManager.player.alpha += new Vector3(0, 0, tmp); levelManager.player.alpha += new Vector3(0, 0, tmp);
} }
else if (Input.GetKeyDown("a")) else if (Input.GetKeyDown("a"))
{ {
var tmp = accelslider.GetLogScaleValue() * (float)Constants.c; var tmp = accelslider.GetLogScaleValue() * (float)Constants.c;
levelManager.player.alpha += new Vector3(-tmp, 0, 0); levelManager.player.alpha += new Vector3(-tmp, 0, 0);
} }
else if (Input.GetKeyDown("s")) else if (Input.GetKeyDown("s"))
{ {
var tmp = accelslider.GetLogScaleValue() * (float)Constants.c; var tmp = accelslider.GetLogScaleValue() * (float)Constants.c;
levelManager.player.alpha += new Vector3(0, 0, -tmp); levelManager.player.alpha += new Vector3(0, 0, -tmp);
} }
else if (Input.GetKeyDown("d")) else if (Input.GetKeyDown("d"))
{ {
var tmp = accelslider.GetLogScaleValue() * (float)Constants.c; var tmp = accelslider.GetLogScaleValue() * (float)Constants.c;
levelManager.player.alpha += new Vector3(tmp, 0, 0); levelManager.player.alpha += new Vector3(tmp, 0, 0);
} }
if (Input.GetKeyUp("w")) if (Input.GetKeyUp("w"))
{ {
levelManager.player.alpha -= new Vector3(0, 0, levelManager.player.alpha.z); levelManager.player.alpha -= new Vector3(0, 0, levelManager.player.alpha.z);
} }
else if (Input.GetKeyUp("a")) else if (Input.GetKeyUp("a"))
{ {
levelManager.player.alpha -= new Vector3(levelManager.player.alpha.x, 0, 0); levelManager.player.alpha -= new Vector3(levelManager.player.alpha.x, 0, 0);
} }
else if (Input.GetKeyUp("s")) else if (Input.GetKeyUp("s"))
{ {
levelManager.player.alpha -= new Vector3(0, 0, levelManager.player.alpha.z); levelManager.player.alpha -= new Vector3(0, 0, levelManager.player.alpha.z);
} }
else if (Input.GetKeyUp("d")) else if (Input.GetKeyUp("d"))
{ {
levelManager.player.alpha -= new Vector3(levelManager.player.alpha.x, 0, 0); levelManager.player.alpha -= new Vector3(levelManager.player.alpha.x, 0, 0);
} }
} }
private Vector3 getMouseClickPosition(RaycastHit hit) private Vector3 getMouseClickPosition(RaycastHit hit)
{ {
var point = Camera.main.WorldToScreenPoint(hit.point); var point = Camera.main.WorldToScreenPoint(hit.point);
return point - canvasSize * 0.5f + middlePoint; return point - canvasSize * 0.5f + middlePoint;
} }
private Vector3 getDestVector(Vector3 ScreenVector, Vector3 RealVector) private Vector3 getDestVector(Vector3 ScreenVector, Vector3 RealVector)
{ {
ScreenVector.z = 0; ScreenVector.z = 0;
RealVector = getXYVectorfromXZVector(RealVector); RealVector = getXYVectorfromXZVector(RealVector);
var v = square.GetDestPoint(prevSelectPathNum) - RealVector; var v = square.GetDestPoint(prevSelectPathNum) - RealVector;
var k = ScreenVector.magnitude / RealVector.magnitude; var k = ScreenVector.magnitude / RealVector.magnitude;
return k * v; return k * v;
} }
private Vector3 getVectorFromAtoB(Vector3 a, Vector3 b) private Vector3 getVectorFromAtoB(Vector3 a, Vector3 b)
{ {
var ret = b - a; var ret = b - a;
return ret; return ret;
} }
private Vector3 getXYVectorfromXZVector(Vector3 v) public Vector3 getXYVectorfromXZVector(Vector3 v)
{ {
return new Vector3(v.x, v.z, 0.0f); return new Vector3(v.x, v.z, 0.0f);
} }
private void updatePathInfo(int pathNum) private void updatePathInfo(int pathNum)
{ {
pathName.text = "Path - " + pathNum; pathName.text = "Path - " + pathNum;
pathVelocity.text = "Velocity: " + square.GetPathVelocity(pathNum).ToString() + "c"; pathVelocity.text = "Velocity: " + square.GetPathVelocity(pathNum).ToString() + "c";
velocityslider.UpdateValuebyVelocity(square.GetPathVelocity(pathNum)); velocityslider.UpdateValuebyVelocity(square.GetPathVelocity(pathNum));
} }
private void TryFIndPath() private void TryFIndPath()
{ {
RaycastHit hit1; RaycastHit hit1;
RaycastHit hit2; RaycastHit hit2;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition); var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit1)) if (Physics.Raycast(ray, out hit1))
{ {
ray = playercamera.ViewportPointToRay(hit1.textureCoord); ray = playercamera.ViewportPointToRay(hit1.textureCoord);
if (Physics.Raycast(ray, out hit2)) if (Physics.Raycast(ray, out hit2))
{ {
var obj = hit2.collider.gameObject; var obj = hit2.collider.gameObject;
Debug.Log(obj.tag); Debug.Log(obj.tag);
if (obj.tag == "path") if (obj.tag == "path")
{ {
int pathNum = int.Parse(obj.name.Substring(13)); int pathNum = int.Parse(obj.name.Substring(13));
if (pathNum != prevSelectPathNum) if (pathNum != prevSelectPathNum)
{ {
prevSelectPathNum = pathNum; prevSelectPathNum = pathNum;
updatePathInfo(pathNum); updatePathInfo(pathNum);
var mouseClickPosition = getMouseClickPosition(hit1); var mouseClickPosition = getMouseClickPosition(hit1);
var v = getDestVector(getVectorFromAtoB(middlePoint, mouseClickPosition), getVectorFromAtoB(player.transform.position, hit2.point)); var v = getDestVector(getVectorFromAtoB(middlePoint, mouseClickPosition), getVectorFromAtoB(player.transform.position, hit2.point));
_pathUI.transform.position = mouseClickPosition + v; _pathUI.transform.position = mouseClickPosition + v;
_pathUI.SetActive(true); _pathUI.SetActive(true);
} }
} }
else else
{ {
_pathUI.SetActive(false); _pathUI.SetActive(false);
prevSelectPathNum = -1; prevSelectPathNum = -1;
sliderflag = 0; sliderflag = 0;
} }
} }
} }
} }
/// <summary> /// <summary>
/// 현재 지정된 path를 시작합니다. /// 현재 지정된 path를 시작합니다.
/// </summary> /// </summary>
public void PathStart() public void PathStart()
{ {
pathRenderer.Background.Toggle = false; _pathUI.SetActive(false);
StartCoroutine(pathRenderer._StartMovingPath(prevSelectPathNum)); pathRenderer.Background.Toggle = false;
_pathUI.SetActive(false); StartCoroutine(pathRenderer._StartMovingPath(prevSelectPathNum));
prevSelectPathNum = -1; prevSelectPathNum = -1;
pathRenderer.PathClear(); }
}
public void PathCancel()
public void PathCancel() {
{ pathRenderer.DeletePathsAfterNthPath(prevSelectPathNum + 1);
pathRenderer.DeletePathsAfterNthPath(prevSelectPathNum + 1); _pathUI.SetActive(false);
_pathUI.SetActive(false); prevSelectPathNum = -1;
prevSelectPathNum = -1; }
}
public void OnDoubleClicked()
public void OnDoubleClicked() {
{ try
try {
{ if (levelManager.player.isInertial())
if (levelManager.player.isInertial()) {
{ RaycastHit hit;
RaycastHit hit; var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
if (Physics.Raycast(ray, out hit)) {
{ ray = playercamera.ViewportPointToRay(hit.textureCoord);
ray = playercamera.ViewportPointToRay(hit.textureCoord); if (Physics.Raycast(ray, out hit))
if (Physics.Raycast(ray, out hit)) {
{ levelManager.player.MoveInfinitelyToAbPosition(pathRenderer.transform.InverseTransformPoint(hit.point), velocityslider.GetLogScaleValue());
levelManager.player.MoveInfinitelyToAbPosition(pathRenderer.transform.InverseTransformPoint(hit.point), velocityslider.GetLogScaleValue()); //levelManager.player.MoveToAbPosition(hit.point, velocityslider.GetLogScaleValue());
//levelManager.player.MoveToAbPosition(hit.point, velocityslider.GetLogScaleValue()); //Debug.Log(velocityslider.GetLogScaleValue() * (float)Constants.c);
//Debug.Log(velocityslider.GetLogScaleValue() * (float)Constants.c); //Debug.Log(hit.point);
//Debug.Log(hit.point); }
} }
} }
} }
} catch (Exception e)
catch (Exception e) {
{ Debug.Log(e);
Debug.Log(e); }
} }
}
public string InteractText
public string InteractText {
{ set
set {
{ interactText.text = value;
interactText.text = value; }
} }
}
public void PopupLastPathUI(int pathNum, RaycastHit hit) public void PopupLastPathUI(int pathNum, RaycastHit hit)
{ {
prevSelectPathNum = pathNum; prevSelectPathNum = pathNum;
updatePathInfo(pathNum); updatePathInfo(pathNum);
var mouseClickPosition = getMouseClickPosition(hit); var mouseClickPosition = getMouseClickPosition(hit);
_pathUI.transform.position = mouseClickPosition; _pathUI.transform.position = mouseClickPosition;
Debug.Log(pathNum + "test");
_pathUI.SetActive(true); _pathUI.SetActive(true);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment