Esempio n. 1
0
        public override bool Animate(float timeSinceProjectileSpawned, Transform projectileTransform, Rigidbody projectileRb)
        {
            float timeSinceAnimStarted;

            if (timeAnimStarted == -1.0f)
            {
                timeSinceAnimStarted = 0.0f;
                timeAnimStarted      = timeSinceProjectileSpawned;
            }
            else
            {
                timeSinceAnimStarted = timeSinceProjectileSpawned - timeAnimStarted;
            }

            GameObject enemy = TargetingUtils.GetClosestEnemyInRange(projectileTransform, Mathf.Infinity);

            if (enemy == null)
            {
                //Debug.Log("No enemies left to home in on.");
                return(false);
            }
            //Debug.Log($"projTransform.position: {projectileTransform.position} - transform.fwd {projectileTransform.transform.forward} - enemy pos: {enemy.transform.position}");

            //Vector3 targetPos =
            //    TargetingUtils.GetTargetPosWithCompensation(projectileTransform, enemy, Mathf.Infinity, 0.0f);
            Vector3 targetPos = Vector3.RotateTowards(projectileTransform.transform.forward,
                                                      enemy.transform.position - projectileTransform.position,
                                                      MaxRadianTurn, 0.0f);

            //Vector3 forceVectorNorm = (targetPos - projectileTransform.position).normalized;
            //Debug.Log(
            //    $"Homing AddForce({targetPos.normalized} * {projectileForce} on projectile to target {targetPos} - timeSinceAnimStarted {timeSinceAnimStarted}");

            //projectileTransform.rotation = Quaternion.RotateTowards(projectileTransform.transform.forward, );
            Quaternion targetRotation = Quaternion.LookRotation(targetPos, projectileTransform.up);

            projectileTransform.rotation = targetRotation;//Quaternion.RotateTowards(currRotation, targetRotation, 1.0f);
            projectileRb.AddForce(targetPos.normalized * projectileForce * 5, ForceMode.Force);

            //Quaternion targetRotation =
            //    Quaternion.LookRotation(targetPos, projectileTransform.up);
            //projectileTransform.rotation = Quaternion.Slerp(projectileTransform.rotation, targetRotation, 1.0f);
            //projectileRb.AddForce(projectileTransform.forward * projectileForce, ForceMode.Force);
            //projectileRb.AddForce(projectileTransform.up * 10.0f, ForceMode.Force);

            //projectileRb.AddForce(
            //    new Vector3(Random.Range(-5.0f, 5.0f), Random.Range(-5.0f, 5.0f), Random.Range(-5.0f, 5.0f)), ForceMode.Impulse);

            return(false);
        }
        private void Update()
        {
            if (initiated)
            {
                int mask = (1 << 9) | (1 << 13);
                //mask = ~mask;

                RaycastHit hitInfo = new RaycastHit();
                bool       hit     = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo,
                                                     Single.PositiveInfinity, mask);
                if (hit)
                {
                    //check on traversability
                    courser.transform.position = map.GetCourserPosition(hitInfo.point);
                }

                if (targetSelected)
                {
                    if (Input.GetMouseButton(1))
                    {
                        timeHoldingBtn += Time.deltaTime;
                    }

                    if (Input.GetMouseButtonUp(1))
                    {
                        if (timeHoldingBtn <= 0.3f)
                        {
                            Deselect();
                        }

                        timeHoldingBtn = 0;
                    }
                }
                else
                {
                    if (Input.GetMouseButtonUp(0))
                    {
                        if (EventSystem.current.IsPointerOverGameObject())
                        {
                            return;
                        }

                        RaycastHit hitLMBInfo = new RaycastHit();
                        bool       hitLMB     = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),
                                                                out hitLMBInfo,
                                                                Single.PositiveInfinity, mask);
                        if (hitLMB)
                        {
                            Component bc;
                            if (hitLMBInfo.collider.TryGetComponent(typeof(BattleController), out bc))
                            {
                                targetForAttack =
                                    hitLMBInfo.collider.gameObject.GetComponent <CharacterBattleController>();
                                if (currentCharControl.characterDataComponent.ap > 1)
                                {
                                    Vector3 attackAlignment =
                                        hitLMBInfo.collider.gameObject.transform.position -
                                        gameObject.transform.position;

                                    float angle = Vector3.SignedAngle(attackAlignment, Vector3.forward, Vector3.up);

                                    int adjIndex         = TargetingUtils.GetAdjIndexByAngle(angle);
                                    int opponentAdjIndex = (adjIndex + 2) % 4;

                                    List <Vector3> attackOrigin =
                                        TargetingUtils.GetPointsOrigin(map, _currentCharacterDataComponent.position,
                                                                       adjIndex);
                                    List <Vector3> attackDestination =
                                        TargetingUtils.GetPointsOrigin(map,
                                                                       targetForAttack.characterDataComponent.position,
                                                                       opponentAdjIndex);

                                    foreach (Vector3 origin in attackOrigin)
                                    {
                                        foreach (Vector3 destination in attackDestination)
                                        {
                                            // int maskForAttack = ~(1 << 9);
                                            RaycastHit hitAtckInfo = new RaycastHit();
                                            bool       hitAtck     = Physics.Raycast(origin, destination - origin,
                                                                                     out hitAtckInfo,
                                                                                     (destination - origin).magnitude);

                                            Debug.DrawLine(origin, destination, Color.white, 5);

                                            if (!hitAtck || hitAtckInfo.collider.gameObject
                                                .GetComponent <CharacterBattleController>() == targetForAttack)
                                            {
                                                originForAttack      = origin;
                                                destinationForAttcak = destination;

                                                Tile curTile = targetForAttack.characterDataComponent.position;

                                                Vector3 curTilePoint =
                                                    map.GetCoordByTileIndexes(curTile.x, curTile.z, curTile.y);
                                                Vector3 vect  = curTilePoint + new Vector3(0, 0.7f, 0);
                                                Vector2 vect2 = Camera.main.WorldToScreenPoint(vect);

                                                confirmButtonGameObject =
                                                    Instantiate(Resources.Load("UIElements/ConfirmBtn")) as GameObject;
                                                confirmButtonGameObject.transform.SetParent(mainUI.transform, false);
                                                confirmButton = confirmButtonGameObject.GetComponent <Button>();
                                                confirmButton.onClick.AddListener(ConfirmTarget);
                                                confirmButtonGameObject.GetComponent <UIinSpace>()
                                                .Initiate(vect, new Vector2(20, 45));

                                                targetSelected = true;
                                                return;
                                            }
                                            else
                                            {
                                                //Debug.Log("Attack is unavailable!");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (Input.GetMouseButton(1))
                    {
                        timeHoldingBtn += Time.deltaTime;
                    }

                    if (Input.GetMouseButtonUp(1))
                    {
                        if (timeHoldingBtn <= 0.3f)
                        {
                            // SwapTargetingController
                            // EndTargeting();
                            currentCharControl.SwapTargeting(0);
                        }

                        timeHoldingBtn = 0;
                    }
                }
            }
        }
Esempio n. 3
0
        private void Update()
        {
            if (initiated)
            {
                // TODO: Correct mask!
                int mask = (1 << 9) | (1 << 13);
                //mask = ~mask;

                RaycastHit hitInfo = new RaycastHit();
                bool       hit     = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo,
                                                     Single.PositiveInfinity, mask);
                if (hit)
                {
                    //check on traversability
                    if (map.GetTileByVectorPoint(hitInfo.point) != null &&
                        map.GetTileByVectorPoint(hitInfo.point).traversable)
                    {
                        courser.transform.position = map.GetCourserPosition(hitInfo.point);
                    }
                }

                if (moveConfirm)
                {
                    if (Input.GetMouseButtonUp(0))
                    {
                        if (EventSystem.current.IsPointerOverGameObject())
                        {
                            return;
                        }

                        if (path.Count < maxPathLength)
                        {
                            RaycastHit hitLMBInfo = new RaycastHit();
                            bool       hitLMB     = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),
                                                                    out hitLMBInfo,
                                                                    Single.PositiveInfinity, mask);
                            if (hitLMB)
                            {
                                if (hitLMBInfo.collider.gameObject.tag.Equals("Floor"))
                                {
                                    curPath = MapUtils.FindPath(map, path.Last(),
                                                                map.GetTileByVectorPoint(hitLMBInfo.point));
                                    if (curPath.Count + path.Count > maxPathLength)
                                    {
                                        curPath = curPath.GetRange(0, maxPathLength - path.Count);
                                    }

                                    curTile = curPath.Last();
                                    Vector3 pathPoint = map.GetCoordByTileIndexes(curTile.x, curTile.z, curTile.y);

                                    additionalRingCoursers.Add(Instantiate(middlePointMapCourserPrefab,
                                                                           pathPoint, Quaternion.identity));
                                    Vector3 vect  = pathPoint + new Vector3(0, 0.7f, 0);
                                    Vector2 vect2 = Camera.main.WorldToScreenPoint(vect);

                                    GameObject text = Instantiate(Resources.Load("UIElements/MoveStep")) as GameObject;
                                    text.transform.SetParent(mainUI.transform, false);
                                    text.GetComponent <UIinSpace>().Initiate(vect);
                                    text.GetComponent <UIinSpace>().ChangeText(additionalRingCoursers.Count.ToString());
                                    additionalNumberCoursers.Add(text);

                                    confirmButtonGameObject.GetComponent <UIinSpace>()
                                    .Initiate(vect, new Vector2(20, 45));

                                    path.AddRange(curPath);

                                    APcostForMovement =
                                        (int)Math.Ceiling((double)path.Count /
                                                          (double)(_currentCharacterDataComponent.speed + _currentCharacterDataComponent.speedModifier));
                                    currentCharControl.DeltaAPRed(APcostForMovement);
                                }
                            }
                        }
                        else
                        {
                            // TODO: Make notification here!
                        }
                    }
                }
                else if (attackConfirm)
                {
                }
                else if (state)
                {
                    if (Input.GetMouseButtonUp(0))
                    {
                        //need this shit to prevent clicking Under UI
                        if (EventSystem.current.IsPointerOverGameObject())
                        {
                            return;
                        }

                        RaycastHit hitLMBInfo = new RaycastHit();
                        bool       hitLMB     = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),
                                                                out hitLMBInfo,
                                                                Single.PositiveInfinity, mask);
                        if (hitLMB)
                        {
                            if (hitLMBInfo.collider.gameObject.tag.Equals("Floor"))
                            {
                                // !!!
                                // TODO: Check if tile can be found in Dictionary, otherwise there will be error here!
                                // !!!

                                curPath = MapUtils.FindPath(map, _currentCharacterDataComponent.position,
                                                            map.GetTileByVectorPoint(hitLMBInfo.point));
                                if (curPath.Count > maxPathLength)
                                {
                                    curPath = curPath.GetRange(0, maxPathLength);
                                }

                                curTile = curPath.Last();
                                Vector3 pathPoint = map.GetCoordByTileIndexes(curTile.x, curTile.z, curTile.y);

                                additionalRingCoursers.Add(Instantiate(middlePointMapCourserPrefab,
                                                                       pathPoint, Quaternion.identity));
                                Vector3 vect  = pathPoint + new Vector3(0, 0.7f, 0);
                                Vector2 vect2 = Camera.main.WorldToScreenPoint(vect);

                                GameObject text = Instantiate(Resources.Load("UIElements/MoveStep")) as GameObject;
                                text.transform.SetParent(mainUI.transform, false);
                                text.GetComponent <UIinSpace>().Initiate(vect);
                                text.GetComponent <UIinSpace>().ChangeText("1");
                                additionalNumberCoursers.Add(text);

                                confirmButtonGameObject =
                                    Instantiate(Resources.Load("UIElements/MoveBtn")) as GameObject;
                                confirmButtonGameObject.transform.SetParent(mainUI.transform, false);
                                confirmButton = confirmButtonGameObject.GetComponent <Button>();
                                confirmButton.onClick.AddListener(ConfirmTarget);
                                confirmButtonGameObject.GetComponent <UIinSpace>()
                                .Initiate(vect, new Vector2(20, 45));

                                path.AddRange(curPath);

                                APcostForMovement =
                                    (int)Math.Ceiling((double)path.Count /
                                                      (double)_currentCharacterDataComponent.speed);
                                currentCharControl.DeltaAPRed(APcostForMovement);

                                moveConfirm = true;

                                // Button button = Instantiate() as Button;
                                // button.onClick.AddListener(ConfirmTarget);
                            }

                            Component bc;

                            if (hitLMBInfo.collider.TryGetComponent(typeof(BattleController), out bc))
                            {
                                //Debug.Log("WOW! " + hitLMBInfo.collider.TryGetComponent(typeof(BattleController), out bc));


                                targetForAttack =
                                    hitLMBInfo.collider.gameObject.GetComponent <CharacterBattleController>();
                                if (currentCharControl.characterDataComponent.ap > 1)
                                {
                                    Vector3 attackAlignment =
                                        hitLMBInfo.collider.gameObject.transform.position -
                                        gameObject.transform.position;

                                    float angle = Vector3.SignedAngle(attackAlignment, Vector3.forward, Vector3.up);

                                    Debug.DrawLine(gameObject.transform.position,
                                                   gameObject.transform.position + attackAlignment, Color.red, 3.5f);
                                    Debug.DrawLine(targetForAttack.gameObject.transform.position,
                                                   targetForAttack.gameObject.transform.position + Vector3.forward, Color.blue,
                                                   3.5f);
                                    Debug.DrawLine(targetForAttack.gameObject.transform.position,
                                                   targetForAttack.gameObject.transform.position + Vector3.right, Color.yellow,
                                                   3.5f);
                                    Debug.DrawLine(targetForAttack.gameObject.transform.position,
                                                   targetForAttack.gameObject.transform.position + Vector3.back, Color.red, 3.5f);
                                    Debug.DrawLine(targetForAttack.gameObject.transform.position,
                                                   targetForAttack.gameObject.transform.position + Vector3.left, Color.black,
                                                   3.5f);

                                    int adjIndex         = TargetingUtils.GetAdjIndexByAngle(angle);
                                    int opponentAdjIndex = (adjIndex + 2) % 4;

                                    //Debug.Log("Angle = " + angle + " - " + adjIndex + ", " + opponentAdjIndex);

                                    List <Vector3> attackOrigin =
                                        TargetingUtils.GetPointsOrigin(map, _currentCharacterDataComponent.position,
                                                                       adjIndex);
                                    List <Vector3> attackDestination =
                                        TargetingUtils.GetPointsOrigin(map,
                                                                       targetForAttack.characterDataComponent.position,
                                                                       opponentAdjIndex);

                                    foreach (Vector3 origin in attackOrigin)
                                    {
                                        foreach (Vector3 destination in attackDestination)
                                        {
                                            // int maskForAttack = ~(1 << 9);
                                            RaycastHit hitAtckInfo = new RaycastHit();
                                            bool       hitAtck     = Physics.Raycast(origin, destination - origin,
                                                                                     out hitAtckInfo,
                                                                                     (destination - origin).magnitude);

                                            Debug.DrawLine(origin, destination, Color.white, 5);

                                            if (!hitAtck || hitAtckInfo.collider.gameObject
                                                .GetComponent <CharacterBattleController>() == targetForAttack)
                                            {
                                                originForAttack      = origin;
                                                destinationForAttcak = destination;

                                                curTile = targetForAttack.characterDataComponent.position;

                                                Vector3 pathPoint =
                                                    map.GetCoordByTileIndexes(curTile.x, curTile.z, curTile.y);
                                                Vector3 vect  = pathPoint + new Vector3(0, 0.7f, 0);
                                                Vector2 vect2 = Camera.main.WorldToScreenPoint(vect);

                                                confirmButtonGameObject =
                                                    Instantiate(Resources.Load("UIElements/AttackBtn")) as GameObject;
                                                confirmButtonGameObject.transform.SetParent(mainUI.transform, false);
                                                confirmButton = confirmButtonGameObject.GetComponent <Button>();
                                                confirmButton.onClick.AddListener(ConfirmTarget);
                                                confirmButtonGameObject.GetComponent <UIinSpace>()
                                                .Initiate(vect, new Vector2(20, 45));

                                                currentCharControl.DeltaAPRed(2);

                                                attackConfirm = true;

                                                return;
                                            }
                                            else
                                            {
                                                //Debug.Log("Attack is unavailable!");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if (Input.GetMouseButton(1))
                {
                    timeHoldingBtn += Time.deltaTime;
                }

                if (Input.GetMouseButtonUp(1))
                {
                    if (timeHoldingBtn <= 0.3f)
                    {
                        Deselect();
                    }

                    timeHoldingBtn = 0;
                }
            }

            // throw new NotImplementedException();
        }