コード例 #1
0
        private object ScanProximity(BaseEntity player, BaseNpc npc)
        {
            float distanceFromNpc = player.Distance(npc);

            if (distanceFromNpc <= settings.ProximityStareDistance)
            {
                if (distanceFromNpc <= settings.ProximityAttackDistance)
                {
                    return(null);
                }
                else
                {
                    npc.StopMoving();
                    npc.transform.LookAt(player.transform);
                }
            }

            return(false);
        }
コード例 #2
0
            private void FixedUpdate()
            {
                if (entity.Sleep < 0.01f)
                {
                    SetState(BaseNpc.Behaviour.Sleep);
                    action = Act.Sleep;
                    var time = UnityEngine.Time.realtimeSinceStartup;
                    if (owner.player.enabled && nextMessageTime < time)
                    {
                        UserMessage(owner.player, "isTired");
                        nextMessageTime = time + 60f;
                    }
                    return;
                }
                if (entity.Energy.Level < 0.01f)
                {
                    var time = UnityEngine.Time.realtimeSinceStartup;
                    if (owner.player.enabled && nextMessageTime < time)
                    {
                        UserMessage(owner.player, "isHungry");
                        nextMessageTime = time + 60f;
                    }
                }
                if (action == Act.Idle || action == Act.Follow)
                {
                    if (entity.IsSleeping)
                    {
                        SetState(BaseNpc.Behaviour.Idle);
                    }

                    if (!stopFollow && Vector3.Distance(entity.transform.position, owner.transform.position) > 10)
                    {
                        entity.UpdateDestination(owner.transform.position + (Vector3.back * 2));
                        return;
                    }
                    if (action == Act.Idle)
                    {
                        SetState(BaseNpc.Behaviour.Idle);
                        entity.StopMoving();
                    }
                    return;
                }
                if (action == Act.Move)
                {
                    if (Vector3.Distance(transform.position, targetPos) < 1)
                    {
                        action = Act.Idle;
                    }
                    else
                    {
                        entity.UpdateDestination(targetPos);
                        SetState(BaseNpc.Behaviour.Attack);
                    }
                }
                else if (action == Act.Drink)
                {
                    if (entity.Hydration.Level >= 1)
                    {
                        action = Act.Idle;
                        SetState(BaseNpc.Behaviour.Idle);
                        return;
                    }
                    if (Vector3.Distance(transform.position, targetPos) < 1)
                    {
                        SetState(BaseNpc.Behaviour.Eat);
                        entity.Hydration.Level += 0.005f;
                        entity.Hydration.Level  = Mathf.Clamp01(entity.Hydration.Level);
                    }
                    else
                    {
                        entity.UpdateDestination(targetPos);
                        SetState(BaseNpc.Behaviour.Attack);
                    }
                }
                else if (action == Act.Sleep)
                {
                    SetState(BaseNpc.Behaviour.Sleep);
                    entity.health += 0.003f;
                    entity.health  = Mathf.Clamp(entity.health, 0, entity.MaxHealth());

                    entity.Sleep += 0.003f;
                    entity.Sleep  = Mathf.Clamp01(entity.Sleep);
                    entity.StopMoving();
                }
                else
                {
                    if (targetEnt == null)
                    {
                        if (!stopFollow)
                        {
                            targetEnt = owner.player;
                        }

                        action = Act.Idle;
                        SetState(BaseNpc.Behaviour.Idle);
                    }
                    else
                    {
                        var distance = Vector3.Distance(transform.position, targetEnt.transform.position);
                        if (distance > targetIgnoreDistance)
                        {
                            action = Act.Idle;
                            SetState(BaseNpc.Behaviour.Idle);
                            return;
                        }
                        if ((action == Act.Eat || entity.Energy.Level < 0.25f) && targetEnt != owner.player)
                        {
                            if (distance <= attackRange)
                            {
                                entity.FoodTarget = targetEnt;
                                if (distance <= 2)
                                {
                                    SetState(BaseNpc.Behaviour.Eat);
                                    entity.Eat();
                                }
                            }
                            else
                            {
                                entity.UpdateDestination(targetEnt.transform.position);
                            }
                        }
                        if (action == Act.Attack && targetEnt != owner.player && distance < targetIgnoreDistance)
                        {
                            if (entity.AttackTarget != targetEnt)
                            {
                                entity.AttackTarget = targetEnt;
                            }

                            SetState(BaseNpc.Behaviour.Attack);
                            entity.UpdateDestination(targetEnt.transform.position);
                        }
                    }
                }
            }