예제 #1
0
        private void StoreSpawnAndGoalPoints()
        {
            var spawnPoints = data.GetChildren("SpawnPoint");

            foreach (var spawnPoint in spawnPoints)
            {
                SpawnPoints.Add(new Vector2D(spawnPoint.GetAttributeValue("Position")));
            }
            var goalPoints = data.GetChildren("ExitPoint");

            foreach (var goalPoint in goalPoints)
            {
                GoalPoints.Add(new Vector2D(goalPoint.GetAttributeValue("Position")));
            }
        }
예제 #2
0
    public Vector3 ComputShootDirection(Transform shooter)
    {
        ballRad = ball.GetChild(1).transform.lossyScale.x * .5f;

        Vector3 shootDirction = Vector3.zero;

        //int childCount = goalPoint.childCount;
        //Vector3[] points = new Vector3[childCount];
        for (int i = 0; i < goalPoints.Length; i++)
        {
            Vector3 direc          = (goalPoints[i].goalPoint.position - ball.position).normalized;
            Vector3 pointsFromBall = ball.position - (direc * ballRad);
            //points[i] = pointsFromBall;
            goalPoints[i].pointsFromBall = pointsFromBall;

            Debug.DrawLine(ball.position, goalPoints[i].goalPoint.position);
            Debug.DrawLine(ball.position, pointsFromBall, Color.red);
        }

        if (goalPoints.Length > 0)
        {
            GoalPoints closeGoalPoint = goalPoints[0];
            float      dis            = 10;
            for (int i = 0; i < goalPoints.Length; i++)
            {
                Vector3 point = goalPoints[i].pointsFromBall;
                Vector3 dir   = point - shooter.position;
                Ray     ray   = new Ray(shooter.position, dir);
                goalPoints[i].madeContactOnRayHit = false;
                if (Physics.Raycast(ray, out RaycastHit hit, 1000, ballMask))
                {
                    float newDis = Vector3.Distance(hit.point, goalPoints[i].pointsFromBall);
                    goalPoints[i].madeContactOnRayHit = true;
                    if (newDis < dis)
                    {
                        dis            = newDis;
                        closeGoalPoint = goalPoints[i];
                    }
                }
            }

            Vector3 closePoint = closeGoalPoint.pointsFromBall;
            Vector3 _dir       = (closePoint - shooter.position).normalized;
            Vector3 per        = Vector3.Cross(_dir, Vector3.up);
            Vector3 invPer     = -per;
            //Debug.DrawLine(testShooter.position, testShooter.position + (per * shooterRad), Color.red);
            //Debug.DrawLine(testShooter.position, testShooter.position + (invPer * shooterRad), Color.red);

            Vector3 rightEdge = shooter.position + (invPer * (shooterRad));
            Vector3 leftEdge  = shooter.position + (per * (shooterRad));

            Debug.DrawLine(shooter.position + (per * shooterRad), closePoint, Color.red);
            Debug.DrawLine(rightEdge, closePoint, Color.red);

            Vector3 rightEdgeDir = (rightEdge - closePoint).normalized;
            Vector3 leftEdgeDir  = (leftEdge - closePoint).normalized;

            Vector3 rightOffsetPerpendicular = closePoint + (Vector3.Cross(rightEdgeDir, -Vector3.up) * (shooterRad - .15f));
            Vector3 leftOffsetPerpendicular  = closePoint + (Vector3.Cross(leftEdgeDir, Vector3.up) * (shooterRad - .15f));

            Vector3 rightTargetOffsetDir = (rightOffsetPerpendicular - shooter.position).normalized;
            Vector3 leftTargetOffsetDir  = (leftOffsetPerpendicular - shooter.position).normalized;

            Debug.DrawLine(closePoint, rightOffsetPerpendicular, Color.red);
            Debug.DrawLine(closePoint, leftOffsetPerpendicular, Color.red);

            shootDirction = _dir;

            switch (closeGoalPoint.goalPointId)
            {
            case Enums.GoalPointID.Right:
                shootDirction = leftTargetOffsetDir;
                Debug.DrawLine(shooter.position, leftOffsetPerpendicular);
                break;

            case Enums.GoalPointID.Center:
                Debug.DrawLine(shooter.position, closePoint);
                break;

            case Enums.GoalPointID.Left:
                shootDirction = rightTargetOffsetDir;
                Debug.DrawLine(shooter.position, rightOffsetPerpendicular);
                break;
            }
        }
        return(shootDirction);
    }