/// <summary> /// 텍스트들을 일정 방향으로 모두 밀어내며 삭제한다. /// </summary> /// <param name="layer"></param> /// <param name="direction"></param> private static void ClearTextsToDirection(FSNSnapshot.Layer layer, FSNInGameSetting.FlowDirection direction) { Vector3 screenHalf = FSNEngine.Instance.ScreenDimension * 0.5f; // 화면 크기 절반 Vector3 dirVec = FSNInGameSetting.GetUnitVectorFromFlowDir(direction); // 흐름 방향 벡터 var uidList = layer.UniqueIDList; int count = uidList.Count; int[] removeIDList = new int[uidList.Count]; uidList.CopyTo(removeIDList, 0); for (int i = 0; i < count; i++) { var textElem = layer.GetElement(removeIDList[i]) as SnapshotElems.Text; textElem.FinalState.Position = textElem.Position + Vector3.Scale(screenHalf, dirVec); // 화면 절반 거리만큼 해당 방향으로 이동 layer.RemoveElement(removeIDList[i]); } }
/// <summary> /// Layer 안에 들어있는 텍스트들을 특정 방향으로 모두 밀어낸다. 알파값도 변경. 수명이 다 된 것은 제거 처리. /// </summary> /// <param name="layer">변경할 레이어 (이미 복제된 상태여야함)</param> /// <param name="direction"></param> /// <param name="newTextSize"></param> private static void PushTextsToDirection(FSNSnapshot.Layer layer, FSNInGameSetting.FlowDirection direction, Vector2 newTextSize, float paraSpacing = 0) { Vector2 dirVec = FSNInGameSetting.GetUnitVectorFromFlowDir(direction); List <int> UIDtoRemove = new List <int>(); // 삭제 리스트 foreach (var uId in layer.UniqueIDList) { var textElem = layer.GetElement(uId) as SnapshotElems.Text; int elemAge = textElem.ChainedParentCount; // 텍스트의 종류에 따라서 다른 룰을 적용한다. if (textElem.type == SnapshotElems.Text.Type.Normal) // ** 일반 텍스트 { Vector3 transVec = Vector2.Scale(newTextSize, dirVec); // 이동할 벡터 양 if (elemAge > 0) { transVec += (Vector3)(dirVec * paraSpacing); // 최초에 등장한 이후엔 문단 간격도 적용 } if (elemAge < c_textLife) // 텍스트가 아직 살아있어야하는 경우 { textElem.Alpha = (float)(c_textLife - elemAge) / (float)c_textLife; textElem.Position = textElem.Position + transVec; CopyCurrentToFinal(textElem); // 임시 FinalState } else { // 텍스트가 죽어야하는 경우 textElem.FinalState.Position = textElem.Position + transVec; UIDtoRemove.Add(uId); } } else { // ** 기타 (선택지 관련 텍스트) int killAge = textElem.type == SnapshotElems.Text.Type.OptionTexts? 1 : 2; //(선택한 텍스트는 1턴 더 살아있어야 하므로) if (elemAge == killAge) // 없어지는 타이밍 { // NOTE : 현재 구조상의 문제로 인해 분기점 이후 바로 없어지는 오브젝트의 FinalState를 여러개 둘 수 없음. // 따라서 분기점 이후에도 한번은 오브젝트를 살려놓은 뒤 안보이게만 하고 다음번에 없애는 식으로. Vector2 halfScreen = FSNEngine.Instance.ScreenDimension / 2f; Vector3 transVec = Vector2.Scale(dirVec, halfScreen); textElem.Position = textElem.Position + transVec; textElem.Alpha = 0f; // TODO : Alpha를 0으로 하는 것 이외에 실제로 visible을 끌 수 있는 방법이 있다면 사용하도록 한다. 지금도 딱히 문제는 없긴 한데... } else if (elemAge == killAge + 1) // 원래 없어져야했던 타이밍이 지나고 나서 실제로 없앤다. { UIDtoRemove.Add(uId); } } } int rmvCount = UIDtoRemove.Count; for (int i = 0; i < rmvCount; i++) // 삭제 리스트 처리 { layer.RemoveElement(UIDtoRemove[i]); } }