// Use this for initialization
    void Start()
    {
        //FlowAI生成 Create FlowAI.
        Assert.AreNotEqual(GetComponent <FlowAIHolder>(), null);
        flowAI = GetComponent <FlowAIHolder>().flowAI;

        ProcessNode chaseNode         = new ProcessNode();
        ProcessNode explodeNode       = new ProcessNode();
        ProcessNode shootNode         = new ProcessNode();
        ProcessNode alertNode         = new ProcessNode();
        ProcessNode patrolMoveNode    = new ProcessNode();
        ProcessNode patrolReachedNode = new ProcessNode();

        BranchNode canSeePlayerNode         = new BranchNode();
        BranchNode playerInAttackRangeNode  = new BranchNode();
        BranchNode checkReachedWaypointNode = new BranchNode();
        BranchNode checkPlayerEscapedNode   = new BranchNode();

        canSeePlayerNode.Initialize(alertNode, 0.05f, checkReachedWaypointNode, 0.05f, CanSeePlayer, "Can See Player?");
        alertNode.Initialize(0.05f, playerInAttackRangeNode, AlertNodeFunction, "Alert Others");
        checkReachedWaypointNode.Initialize(patrolReachedNode, 0.05f, patrolMoveNode, 0.05f, CheckReachedWaypoint, "Reached Waypoint?");

        chaseNode.Initialize(0.05f, checkPlayerEscapedNode, ChaseNodeFunction, "Chase Target");
        checkPlayerEscapedNode.Initialize(canSeePlayerNode, 0.05f, playerInAttackRangeNode, 0.05f, CheckPlayerEscaped, "Has Target Escaped?");

        patrolMoveNode.Initialize(0.05f, canSeePlayerNode, PatrolMoveNodeFunction, "Patrol Move");
        patrolReachedNode.Initialize(0.05f, canSeePlayerNode, PatrolReachedNodeFunction, "Patrol Reached Waypoint");

        switch (attackType)
        {
        case AttackType.AttackType_Explode:
            explodeNode.Initialize(0.05f, null, ExplodeNodeFunction, "Explosion!");
            playerInAttackRangeNode.Initialize(explodeNode, 0.05f, chaseNode, 0.05f, PlayerInAttackRange, "Is Target In Explosion Range?");
            flowAI.AddNode(explodeNode);
            break;

        case AttackType.AttackType_Shoot:
            shootNode.Initialize(1.0f, playerInAttackRangeNode, ShootNodeFunction, "Shoot!");
            playerInAttackRangeNode.Initialize(shootNode, 0.05f, chaseNode, 0.05f, PlayerInAttackRange, "Is Target In Shooting Range?");
            flowAI.AddNode(shootNode);
            break;

        default:
            break;
        }


        flowAI.AddNode(alertNode, patrolMoveNode, patrolReachedNode, chaseNode, canSeePlayerNode, playerInAttackRangeNode, checkReachedWaypointNode, checkPlayerEscapedNode);

        //エントリポイントの次のノードを設定 Setting next node for entry point node.
        flowAI.entryPointNode.nextNode = canSeePlayerNode;

        //AI開始 Transition entry point.
        flowAI.Entry();

        chaseNodeId = chaseNode.localId;

        // Initialise events.
        InitEvents();

        chaseGiveUpTimer = chaseGiveUpDuration;
        visionCone.SetMaterial(patrolCannotSeePlayerMaterial);
        visionCone.CreateVisionConeObject(gameObject);
    }