/// <summary> /// This method is used to draw the snake path and applying effects to them. /// </summary> public void DrawCurve() { // Remove any previous curves. // Make a path. if (_startPoint != null && _endPoint != null) { List <Point> ptArr = CreatePathPoints(_startPoint, _endPoint); MakeCurve(ptArr, 100); System.Windows.Media.Effects.BlurEffect blurEffect2 = new System.Windows.Media.Effects.BlurEffect(); blurEffect2.Radius = 3; blurEffect2.KernelType = System.Windows.Media.Effects.KernelType.Gaussian; SnakePath.Effect = blurEffect2; SnakePath.Clone(ref InnerSnakePath); InnerSnakePath.Stroke = Brushes.DarkRed; System.Windows.Media.Effects.BlurEffect blurEffect0 = new System.Windows.Media.Effects.BlurEffect(); blurEffect0.Radius = 2; blurEffect0.KernelType = System.Windows.Media.Effects.KernelType.Gaussian; InnerSnakePath.Effect = blurEffect0; SnakePath.Clone(ref CenterSnakePath); CenterSnakePath.Stroke = Brushes.DarkOliveGreen; System.Windows.Media.Effects.BlurEffect blurEffect1 = new System.Windows.Media.Effects.BlurEffect(); blurEffect1.Radius = 1; blurEffect1.KernelType = System.Windows.Media.Effects.KernelType.Gaussian; CenterSnakePath.Effect = blurEffect1; DrawTongue(); DrawEyes(); DrawTail(); UpdateLayout(); } }
/// <summary> /// Copy the snake path data and revert it /// </summary> private void RevertSnakePath(Vector3 revertDirection, SnakePath copyPath) { SnakePath emptySnakepath = ScriptableObject.CreateInstance <SnakePath>(); string fileName = copyPath.name + "_Clone.asset"; AssetDatabase.CreateAsset(emptySnakepath, EventFlag.Path.SnakePathSRPFolder + fileName); int pointCount = copyPath.PointCount; for (int i = 0; i < pointCount; i++) { float yOffset = creator.YAxisConstraints.y - copyPath[i].y; float revertYPos = creator.YAxisConstraints.x + yOffset; float xOffset = creator.XAxisConstraints.y - copyPath[i].x; float revertXPos = creator.XAxisConstraints.x + xOffset; var revertPath = new Vector3((revertDirection.x == -1) ? revertXPos : copyPath[i].x, (revertDirection.y == -1) ? revertYPos : copyPath[i].y, copyPath[i].z ); emptySnakepath.Push(revertPath); } var snakeCreator = GUtil.UtilityMethod.CreateObjectToParent <SnakePathCreator>(creator.transform.parent, creator.transform.gameObject); snakeCreator.transform.position = creator.transform.position; snakeCreator.SetSnakePath(emptySnakepath); AssetDatabase.SaveAssets(); }
public void SetSnakePath(SnakePath snakePath) { if (_snakeMesh == null) { return; } _snakePath = snakePath; RenderPathLayoutToMesh(); }
private SnakeMesh SpawnSnakeMesh(Types.LevelComponent component) { SnakeMesh spawnEmptySnake = UtilityMethod.CreateObjectToParent <SnakeMesh>(SnakeHolder, snakePrefab.gameObject); SnakePath snakePathData = LevelSRP.GetSnakePath(component.value); if (snakePathData != null) { spawnEmptySnake.SetUp(); spawnEmptySnake.SetSnakePath(snakePathData, false); spawnEmptySnake.RenderMesh(); spawnEmptySnake.transform.position = new Vector3(snakePathData.OffsetPosition.x, -0.8f, default_distance - snakePathData[0].z); } return(spawnEmptySnake); }
public void SmoothCtrlPoints(int startIndex, int endIndex) { for (int i = startIndex; i <= endIndex; i += 3) { if (i <= 0 || i >= snakePath.PointCount - 1 || !SnakePath.IsAnchorPoint(i)) { continue; } Vector3 anchorFaceDir = (snakePath[i + 3] - snakePath[i - 3]).normalized; float halfPreviousDist = Vector3.Distance(snakePath[i - 3], snakePath[i]) * 0.5f; float halfForwardDist = Vector3.Distance(snakePath[i + 3], snakePath[i]) * 0.5f; //Debug.Log($"index {i},halfPreviousDist {halfPreviousDist}, halfForwardDist {halfForwardDist}"); snakePath.ForceUpdate(snakePath[i] - (anchorFaceDir * halfPreviousDist), (i - 1)); snakePath.ForceUpdate(snakePath[i] + (anchorFaceDir * halfForwardDist), (i + 1)); } }
public IEnumerator Spawn (float delay) { yield return new WaitForSeconds( delay ); CurrentPath = SnakePathRegistry.Instance.GetUnusedPath(); SnakePathRegistry.Instance.LockPath( CurrentPath ); CurrentPath.ShowDigAtStart(); yield return new WaitForSeconds( BalanceValues.Instance.SnakeSpawnDigDelay ); SoundManager.Instance.SnakeSpawned(); var SpawnQueue = new Queue<SnakeSegment>( Segments ); while (SpawnQueue.Count > 0) { var nextSegment = SpawnQueue.Dequeue(); nextSegment.transform.position = CurrentPath.StartPosition; nextSegment.gameObject.SetActive( true ); nextSegment.Path = CurrentPath; while (nextSegment.transform.position == CurrentPath.StartPosition) { yield return null; } } CurrentPath.HideDigAtStart(); }
void Draw(Event guiEvent) { if (creator.snakePath != null) { creator.snakePath.OffsetPosition = creator.transform.position; for (int i = 0; i < creator.snakePath.NumSegments; i++) { Vector3[] points = creator.snakePath.GetPointsInSegment(i); points = ConvertArrayToWorldPos(points); Handles.color = Color.black; Vector3 worldPos = ConvertToWorldPos(creator.snakePath[i]); Vector3 newPos = Handles.FreeMoveHandle(worldPos, Quaternion.identity, .2f, _snap, Handles.CylinderHandleCap); Handles.DrawLine(points[1], (points[0])); Handles.DrawLine(points[2], (points[3])); Color bezierColor = (i == lastBezierSegmentInfo.SegmentIndex) ? Color.yellow : Color.green; if (i == lastBezierSegmentInfo.SegmentIndex) { Handles.color = Color.red; Handles.SphereHandleCap(0, lastBezierSegmentInfo.Position, Quaternion.identity, 0.2f, EventType.Repaint); } Handles.DrawBezier(points[0], points[3], points[1], points[2], bezierColor, null, 2); } for (int i = 0; i < creator.snakePath.PointCount; i++) { bool isAnchorP = SnakePath.IsAnchorPoint(i); Handles.color = (isAnchorP) ? Color.red : Color.blue; Vector3 worldPos = ConvertToWorldPos(creator.snakePath[i]); Vector3 newPos = Handles.FreeMoveHandle(worldPos, Quaternion.identity, .2f, _snap, Handles.CylinderHandleCap); Vector3 LocalPos = ConvertToLocalPos(newPos); if (isAnchorP) { LocalPos = ClampPositionToConstraint(LocalPos); } //Move Anchor Around if (creator.snakePath[i] != LocalPos && (!creator.enableAutoContorlPoint || ((creator.enableAutoContorlPoint && isAnchorP) || //The first / last control point leave to player to decide i <= 1 || i >= creator.snakePath.PointCount - 2))) { Undo.RecordObject(creator.snakePath, "Move point"); creator.snakePath.UpdateAnchor(LocalPos, i); if (creator.enableAutoContorlPoint) { AutoSetControlPointIfEnable(i); } } } } }