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;
            }
        }
    }
示例#2
0
    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);
    }