protected void UpdateOnToken() { if (!placed) { return; } bool isOnToken = TokensManager.Instance.GetToken(transform.position, out currentTokenHit); if (null == prevTokenHit) { prevTokenHit = currentTokenHit; } tokenName = "OUT!!"; if (isOnToken) { tokenName = currentTokenHit.token.name; longitudinal = currentTokenHit.longitudinal; trasversal = currentTokenHit.trasversal; if (prevTokenHit.token != currentTokenHit.token) { gameManagers.SendMessage("CurrentToken", currentTokenHit.token); if (currentTokenHit.token.type == Token.TokenType.Cross) { int prevIndex = 0; for (int i = 0; i < currentTokenHit.token.links.Length; i++) { if (prevTokenHit.token == currentTokenHit.token.links[i]) { prevIndex = i; break; } } prevIndex = (prevIndex == 0) ? 4 : prevIndex; forwardIndex = (prevIndex + 2) % 4; rightIndex = (prevIndex - 1) % 4; leftIndex = (prevIndex + 1) % 4; wallIndexes.Add(prevIndex); availableDirections[0] = currentTokenHit.token.links[forwardIndex] != null; if (availableDirections[0]) { wallIndexes.Add(forwardIndex); } availableDirections[1] = currentTokenHit.token.links[rightIndex] != null; if (availableDirections[1]) { wallIndexes.Add(rightIndex); } availableDirections[2] = currentTokenHit.token.links[leftIndex] != null; if (availableDirections[2]) { wallIndexes.Add(leftIndex); } fsm.State = Choose; } else { wallIndexes.Clear(); envManager.DisableWallsOnToken(); Debug.Log("Disable walls"); } prevTokenHit = currentTokenHit; } } }
public void Build() { int count = startTransforms.Length; startTokens = new Token[count]; startOffsets = new float[count]; rootBranches = new TrackBranch[count]; TokensManager.TokenHit[] hits = new TokensManager.TokenHit[count]; for (int i = 0; i < count; ++i) { SBSVector3 p = startTransforms[i].position; hits[i] = new TokensManager.TokenHit(); TokensManager.Instance.GetToken(p, out hits[i]); Asserts.Assert(hits[i].token != null); TrackBranch branch = hits[i].token.TrackBranch; startTokens[i] = hits[i].token; rootBranches[i] = branch; } // ToDo foreach (KeyValuePair <TrackBranch, BranchNode> item in branchNodes) { item.Value.Initialize(); } Stack <TrackBranch> branches = new Stack <TrackBranch>(); List <TrackBranch> visitedBranches = new List <TrackBranch>(); branches.Push(rootBranches[0]); visitedBranches.Add(rootBranches[0]); rootBranches[0].startLength = 0.0f; while (branches.Count > 0) { TrackBranch branch = branches.Pop(); BranchNode node = branchNodes[branch]; float maxBranchLength = 0.0f; foreach (BranchNode nextNode in node.NextLinks) { maxBranchLength = SBSMath.Max(maxBranchLength, nextNode.Branch.Length); } foreach (BranchNode nextNode in node.NextLinks) { if (!branches.Contains(nextNode.Branch) && !visitedBranches.Contains(nextNode.Branch)) { nextNode.Branch.LengthScale = maxBranchLength / nextNode.Branch.Length; nextNode.Branch.startLength = Mathf.Max(nextNode.Branch.startLength, branch.startLength + branch.Length); visitedBranches.Add(branch); branches.Push(nextNode.Branch); } } }/* * foreach (KeyValuePair<TrackBranch, BranchNode> item in branchNodes) * Debug.Log(item.Value.Branch.startLength + ", " + item.Value.Branch.Length); */ for (int i = 0; i < count; ++i) { TrackBranch branch = hits[i].token.TrackBranch; startOffsets[i] = (branch.startLength + hits[i].longitudinal * hits[i].token.Length) * branch.LengthScale; Debug.Log("startOffsets[" + i + "] = " + startOffsets[i]); } maxLength = 0.0f; foreach (KeyValuePair <TrackBranch, BranchNode> item in branchNodes) { maxLength = SBSMath.Max(maxLength, item.Key.startLength + item.Key.Length); } Debug.Log("Track length: " + maxLength); }