private bool GroundTest(PlayerEntity playerEntity, out float dist)
        {
            bool ret = false;

            dist = 0f;
            var controller = playerEntity.characterContoller.Value;
            var radius     = controller.radius;
            var gameObject = playerEntity.RootGo();
            var prevLayer  = gameObject.layer;

            IntersectionDetectTool.SetColliderLayer(gameObject, UnityLayerManager.GetLayerIndex(EUnityLayerName.User));
            var playerPos  = playerEntity.position.Value;
            var startPoint = new Vector3(playerPos.x, SingletonManager.Get <MapConfigManager>().WaterSurfaceHeight(playerPos), playerPos.z);
            // a shift lift up
            RaycastHit outHit;

            //DebugDraw.DebugWireSphere(startPoint + new Vector3(0,-(AnimatorParametersHash.FirstPersonStandCameraHeight - radius + DisOffset),0) , radius, 0 , false);
            if (Physics.SphereCast(startPoint, radius, Vector3.down, out outHit, AnimatorParametersHash.FirstPersonStandCameraHeight - radius + DisOffset, UnityLayers.AllCollidableLayerMask))
            {
                ret  = true;
                dist = outHit.distance + radius;
            }
            IntersectionDetectTool.SetColliderLayer(gameObject, prevLayer);
            //_logger.InfoFormat("GroundTest : {0}", ret);
            return(ret);
        }
예제 #2
0
        /// <summary>
        /// 确定指定x,z位置的落地点(y方向值)
        /// </summary>
        private Vector3 FindTheGroundPos(Vector3 pos)
        {
            Vector3 fromV = new Vector3(pos.x, 1000, pos.z);

            Vector3 toV = new Vector3(pos.x, -1000, pos.z);

            Ray r = new Ray(fromV, new Vector3(toV.x - fromV.x, toV.y - fromV.y, toV.z - fromV.z));

            RaycastHit hitInfo;

            bool hitted = Physics.Raycast(r, out hitInfo, Mathf.Infinity,
                                          UnityLayers.SceneCollidableLayerMask |
                                          (1 << UnityLayerManager.GetLayerIndex(EUnityLayerName.WaterTrigger)));
            float yVal = 0;

            if (hitted == false)
            {
                yVal = pos.y;
            }
            else
            {
                yVal = hitInfo.point.y;
            }

            Vector3 groundPos = new Vector3(pos.x, hitInfo.point.y, pos.z);

            return(groundPos);
        }
 public void PlayerDead(bool isSelf = true)
 {
     SetLayer(_thirdModel, UnityLayerManager.GetLayerIndex(EUnityLayerName.NoCollisionWithEntity));
     CloseEye();
     _controller.enabled = false;
     Logger.InfoFormat("CharacterLog-- PlayerDead :{0}", _characterRoot);
 }
예제 #4
0
        private bool DetectObstacle(GameObject go, bool isPositiveDirect)
        {
            bool hasObstacle = false;

            for (int i = 0; i < go.transform.childCount; i++)
            {
                var child = go.transform.GetChild(i);
                if (child.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.UserInputRaycast))
                {
                    var forwardOfDoor = isPositiveDirect ? go.transform.forward : -go.transform.forward;
                    var width         = Math.Max(child.localScale.x, child.localScale.z);
                    var thick         = Math.Min(child.localScale.x, child.localScale.z);

                    var extents = new Vector3(width - 2 * thick, child.localScale.y - thick, width - 2 * thick) / 2;

                    var center = child.position;
                    center += forwardOfDoor.normalized * (width) / 2;

                    if (Physics.CheckBox(center, extents, child.rotation, UnityLayers.DoorCastLayerMask))
                    {
                        hasObstacle = true;
                    }
                }
            }

            return(hasObstacle);
        }
예제 #5
0
        private static bool IsTerrian(RaycastHit hitInfo)
        {
            var terrain        = hitInfo.collider.gameObject.GetComponent <Terrain>();
            var isTerrainLayer = hitInfo.collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.Terrain);

            return(terrain != null || isTerrainLayer);
        }
예제 #6
0
        public override UnitPosition Select(IEventArgs args)
        {
            UnitPosition up       = pos.Select(args);
            Vector3      position = UnityPositionUtil.ToVector3(up);

            RaycastHit hitInfo;

            if (SingletonManager.Get <MapConfigManager>().InWater(position))
            {
                Ray  ray = new Ray(position, Vector3.up);
                bool hit = Physics.Raycast(ray, out hitInfo, 10000, UnityLayerManager.GetLayerMask(EUnityLayerName.WaterTrigger));
                if (hit)
                {
                    return(UnityPositionUtil.FromVector(hitInfo.point - new Vector3(0, waterDelta, 0)));
                }
            }
            else
            {
                Ray  ray = new Ray(position, Vector3.down);
                bool hit = Physics.Raycast(ray, out hitInfo, 10000, UnityLayers.SceneCollidableLayerMask | UnityLayerManager.GetLayerMask(EUnityLayerName.WaterTrigger));
                if (hit)
                {
                    if (hitInfo.collider.transform.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.WaterTrigger))
                    {
                        return(UnityPositionUtil.FromVector(hitInfo.point - new Vector3(0, waterDelta, 0)));
                    }
                    else
                    {
                        return(UnityPositionUtil.FromVector(hitInfo.point));
                    }
                }
            }
            return(up);
        }
예제 #7
0
 public void PlayerReborn()
 {
     SetLayer(_characterRoot, UnityLayerManager.GetLayerIndex(EUnityLayerName.Player));
     openEye();
     _controller.enabled = true;
     Logger.InfoFormat("PlayerReborn: {0}", _characterRoot);
 }
예제 #8
0
        public static GameObject InitHitBoxComponent(EntityKey entityKey, IHitBox playerEntity, GameObject hitboxGo)
        {
            hitboxGo.name = "hitbox_" + entityKey;
            GameObject bsGo = HitBoxConstants.FindBoundingSphereModel(hitboxGo);

            SphereCollider sc = bsGo.GetComponent <SphereCollider>();

            sc.enabled = false;

            hitboxGo.transform.Recursively(t =>
            {
                var go = t.gameObject;
                HitBoxOwnerComponent pc = go.GetComponent <HitBoxOwnerComponent>();
                if (pc == null)
                {
                    pc = go.AddComponent <HitBoxOwnerComponent>();
                }
                pc.OwnerEntityKey   = entityKey;
                pc.gameObject.layer = UnityLayerManager.GetLayerIndex(EUnityLayerName.Hitbox);
            });
            playerEntity.AddHitBox(-1, new BoundingSphere(sc.center, sc.radius), hitboxGo, false);
            hitboxGo.SetActive(false);

            return(hitboxGo);
        }
예제 #9
0
        protected override void InternalExecute()
        {
            var player     = _contexts.player.flagSelfEntity;
            var controller = player.WeaponController();

            if (!player.gamePlay.IsLifeState(EPlayerLifeState.Alive) || !player.gamePlay.CanAutoPick())
            {
                return;
            }

            Collider[] colliders = Physics.OverlapCapsule(player.position.Value, player.bones.Head.position,
                                                          0.4f, UnityLayerManager.GetLayerMask(EUnityLayerName.UserInputRaycast));
            foreach (Collider collider in colliders)
            {
                var rcTar = collider.transform.GetComponentInParent <RayCastTarget>();
                if (rcTar == null)
                {
                    continue;
                }
                if (SingletonManager.Get <GameModeConfigManager>().GetBagTypeById(_contexts.session.commonSession.RoomInfo.ModeId) == EBagType.Chicken)
                {
                    var target = _contexts.sceneObject.GetEntityWithEntityKey(new EntityKey(rcTar.IdList[1], (short)EEntityType.SceneObject));
                    if (target.simpleItem.Category == (int)ECategory.Weapon && player.WeaponController().FilterAutoPickup(target.simpleItem.Id))
                    {
                        var model = target.hasUnityObject ? target.unityObject.UnityObject : target.multiUnityObject.FirstAsset;
                        if (CommonObjectCastUtil.HasObstacleBetweenPlayerAndItem(player, target.position.Value, model))
                        {
                            continue;
                        }

                        SimpleProto pickUp = FreePool.Allocate();
                        pickUp.Key = FreeMessageConstant.PickUpItem;
                        pickUp.Ins.Add(rcTar.IdList[1]);
                        pickUp.Ins.Add(target.simpleItem.Category);
                        pickUp.Ins.Add(target.simpleItem.Id);
                        pickUp.Ins.Add(1);
                        player.network.NetworkChannel.SendReliable((int)EClient2ServerMessage.FreeEvent, pickUp);
                    }
                }
                else
                {
                    _userCmdGenerator.SetUserCmd((userCmd) =>
                    {
                        if (!userCmd.AutoPickUpEquip.Contains(rcTar.IdList[1]))
                        {
                            userCmd.AutoPickUpEquip.Add(rcTar.IdList[1]);
                        }
                    });
                }
            }

            if (controller.AutoThrowing.HasValue && controller.AutoThrowing.Value)
            {
                if (null != _userCmdGenerator && controller.RelatedThrowAction.IsReady == true)
                {
                    _userCmdGenerator.SetUserCmd((userCmd) => { userCmd.IsThrowing = true; });
                    controller.AutoThrowing = false;
                }
            }
        }
예제 #10
0
        public bool LineOfSight(Vector3 position, PlayerEntity target, bool checkposition)
        {
            if ((position - target.position.Value).magnitude < 0.5)
            {
                return(true);
            }

            var bonePosition = target.bones.Head;
            var offset       = Vector3.zero;

            offset = target.RootGo().transform.InverseTransformPoint(target.cameraObj.FPCamera
                                                                     .transform.position);
            if (checkposition)
            {
                if (!NavMesh.SamplePosition(position, out m_NavMeshHit, 2f, NavMesh.AllAreas))
                {
                    return(false);
                }
            }
            else
            {
                Physics.Linecast(position + offset, bonePosition.position, out hit, UnityLayerManager.GetLayerMask(EUnityLayerName.Player));
            }


            return(true);
        }
        public void OnLoadSuccess <T>(T source, UnityObject unityObj)
        {
            if (null == unityObj || null == unityObj.AsGameObject)
            {
                _assetInfo = AssetInfo.EmptyInstance;
                return;
            }

            if (!unityObj.AsGameObject.activeSelf)
            {
                Logger.ErrorFormat("unityObj:  {0}  is unActive", unityObj.Address);
                _assetInfo = AssetInfo.EmptyInstance;
                return;
            }

            Logger.InfoFormat("Load Weapon: {0}", unityObj.Address);

            SetObjParam(unityObj, UnityLayerManager.GetLayerIndex(EUnityLayerName.Player));

            if (!unityObj.Address.Equals(_assetInfo))
            {
                AddRecycleObject(unityObj);
                _assetInfo = AssetInfo.EmptyInstance;
                return;
            }

            _action(unityObj, _assetId);

            EffectUtility.ReflushGodModeEffect(_rootGo, unityObj.AsGameObject);
            _assetInfo = AssetInfo.EmptyInstance;
        }
예제 #12
0
        private static bool IsVehicleTrigger(RaycastHit hitInfo)
        {
            var isTrigger = hitInfo.collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.VehicleTrigger);
            var isHitBox  = hitInfo.collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.Hitbox);

            return(isTrigger);
        }
예제 #13
0
        private void SetCache(Transform trans)
        {
            for (int i = 0; i < trans.childCount; i++)
            {
                var child = trans.GetChild(i);
                SetCache(child);

                var rigidbody = child.GetComponent <Rigidbody>();
                if (rigidbody != null)
                {
                    _rigidbodyCache.Add(child.name, rigidbody);
                }

                if (child.gameObject.layer != UnityLayerManager.GetLayerIndex(EUnityLayerName.Hitbox))
                {
                    continue;
                }

                var collider = child.GetComponent <Collider>();
                if (collider == null)
                {
                    continue;
                }
                _transformCache.Add(child.name, child);
                _hitBoxCache.Add(child.name, collider);
            }
        }
        private void IgnorePlayerVehicleCollision(bool ignore)
        {
            var layer       = ignore ? UnityLayerManager.GetLayerIndex(EUnityLayerName.PlayerIgnoreVehicle) : UnityLayerManager.GetLayerIndex(EUnityLayerName.Player);
            var players     = _players.GetEntities();
            int playerCount = players.Length;

            for (int i = 0; i < playerCount; ++i)
            {
                try
                {
                    var player     = players[i];
                    var gamePlayer = player.gamePlay;
                    var root       = player.RootGo();
                    if (root == null)
                    {
                        _logger.ErrorFormat("GameObject for Player Entity {0} Deleted Destroy Flag {1}", player.hasEntityKey ? player.entityKey.ToString() : "NoEntityKey", player.isFlagDestroy);
                        continue;
                    }

                    if (gamePlayer.IsDead() || !root.activeSelf)
                    {
                        continue;
                    }

                    root.layer = layer;
                }
                catch (Exception e)
                {
                    _logger.ErrorFormat("{0}", e);
                }
            }
        }
        private bool HasObstacle(Vector3 colPosition, Vector3 bombPosition, Func <Transform, bool> exclude = null)
        {
            RaycastHit hitInfo;

            if (null == exclude)
            {
                Debug.DrawLine(bombPosition, colPosition, Color.red, 10f);
                if (Physics.Linecast(bombPosition, colPosition, out hitInfo, UnityLayerManager.GetLayerMask(EUnityLayerName.Default)))
                {
                    return(true);
                }
                return(false);
            }
            var dir       = colPosition - bombPosition;
            var obstacles = Physics.RaycastAll(bombPosition, dir, dir.magnitude, UnityLayerManager.GetLayerMask(EUnityLayerName.Default));

            foreach (var obstacle in obstacles)
            {
                if (!exclude(obstacle.transform))
                {
                    return(true);
                }
            }
            return(false);
        }
 public void FlushLayerOfHitBox()
 {
     foreach (var item in _handler.GetTransforms())
     {
         item.Value.gameObject.layer = UnityLayerManager.GetLayerIndex(EUnityLayerName.Hitbox);
     }
 }
        private void CollisionHandler(IThrowingSegment segment, RaycastHit hit)
        {
            //            Debug.LogFormat("Throwing collision dir:{0}, pos:{1}, normal:{2}", segment.RaySegment.Ray.direction, segment.RaySegment.Ray.origin, hit.normal);
            //glass broken
            var reflectiveFace = true;

            if (hit.collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.Glass))
            {
                var glassChunk = hit.collider.GetComponent <FracturedGlassyChunk>();
                if (glassChunk != null)
                {
                    glassChunk.MakeBroken();
                }
                reflectiveFace = false;
            }

            if (DebugConfig.DrawThrowingLine)
            {
                RuntimeDebugDraw.Draw.DrawLine(segment.RaySegment.Ray.origin, (segment.RaySegment.Ray.origin + hit.normal * 5), Color.red, 60f);
            }

            ThrowingEntity throwing = segment.ThrowingEntity;

            //位置
            throwing.position.Value = segment.RaySegment.Ray.origin;
            if (reflectiveFace)
            {
                //反射
                throwing.throwingData.Velocity = Vector3.Reflect(throwing.throwingData.Velocity, hit.normal);
                //衰减
                throwing.throwingData.Velocity *= (1 - throwing.throwingData.ThrowConfig.CollisionVelocityDecay);
            }
        }
예제 #18
0
        private static bool IsHitGround(PlayerEntity playerEntity, float dist)
        {
            var gameObject = playerEntity.RootGo();
            var prevLayer  = gameObject.layer;

            IntersectionDetectTool.SetColliderLayer(gameObject, UnityLayerManager.GetLayerIndex(EUnityLayerName.User));
            var startPoint  = gameObject.transform.position;
            var valueRadius = playerEntity.characterContoller.Value.radius;

            //UnityLayers.
            // a shift lift up
            startPoint = startPoint + gameObject.transform.rotation * new Vector3(0f, valueRadius, 0f);
            RaycastHit outHit;

//            DebugDraw.DebugWireSphere(startPoint, Color.red, CastRadius, 1f);
//            DebugDraw.DebugWireSphere(startPoint + new Vector3(0,targetHeight - CastRadius - LiftUp,0), Color.magenta, CastRadius, 1f);
            var isHit = PhysicsCastHelper.SphereCast(startPoint, CastRadius, Vector3.down, out outHit, dist,
                                                     UnityLayers.AllCollidableLayerMask, QueryTriggerInteraction.Ignore, 0.1f);

            //if (!isHit)
            {
                //DebugDraw.DebugWireSphere(startPoint,isHit ? Color.green : (playerEntity.characterContoller.Value.isGrounded ? Color.magenta : Color.red) ,CastRadius, isHit ? 0f:60f);
            }
            IntersectionDetectTool.SetColliderLayer(gameObject, prevLayer);
            return(isHit);
        }
예제 #19
0
        void OnTriggerEnter(Collider collider)
        {
            if (collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.VehicleTrigger))
            {
                _collidedTriggerCount++;

                var vehicle = VehicleEntityUtility.GetVehicleFromChildCollider(collider);
                if (vehicle != null)
                {
                    SetCollisionState(vehicle, EVehicleCollisionState.Enter);

                    var collisionTime = MyGameTime.time;
                    if (collisionTime - _lastCollisionTime > 0.34f)
                    {
                        var damage = CalcPlayerCollisionDamage(vehicle);
                        if (DamageEnabled && damage > 0.0f)
                        {
                            var sourcePlayer = vehicle.hasOwnerId ? AllContext.player.GetEntityWithEntityKey(vehicle.ownerId.Value) : null;
                            VehicleDamageUtility.DoPlayerDamage(AllContext, sourcePlayer, _playerEntity, damage);
                        }
                        _lastCollisionTime = collisionTime;
                    }
                }
            }
        }
예제 #20
0
        private void DoExlopsionDamageToNeighboringObjects(VehicleEntity vehicle)
        {
            var explosionCenter = vehicle.GetExplosionCenter();
            var layerMask       = UnityLayerManager.GetLayerMask(EUnityLayerName.Player) | UnityLayerManager.GetLayerMask(EUnityLayerName.Vehicle);

            Collider[] colliders = Physics.OverlapSphere(explosionCenter, MaxOverlapRadius, layerMask);
            DoExplosionDamageToColliders(vehicle, colliders, explosionCenter);
        }
예제 #21
0
            protected void HandleLoadedModel(PlayerEntity player, GameObject obj)
            {
                obj.layer = UnityLayerManager.GetLayerIndex(EUnityLayerName.Player);
                PlayerEntityUtility.DisableCollider(obj.transform);

                if (!player.hasCharacterContoller)
                {
                    var character = DefaultGo.CreateGameObject(player.entityKey.ToString());
                    character.layer = UnityLayerManager.GetLayerIndex(EUnityLayerName.Player);
                    CharacterController        cc  = PlayerEntityUtility.InitCharacterController(character);
                    KinematicCharacterMotor    kcc = PlayerEntityUtility.InitKinematicCharacterMotor(character);
                    CharacterControllerContext characterControllerContext = new CharacterControllerContext(
                        new UnityCharacterController(cc, !player.isFlagSelf),
                        new Core.CharacterController.ConcreteController.ProneCharacterController(kcc,
                                                                                                 new ProneController()),
                        new Core.CharacterController.ConcreteController.DiveCharacterController(kcc,
                                                                                                new DiveController()),
                        new Core.CharacterController.ConcreteController.SwimCharacterController(kcc,
                                                                                                new SwimController())
                        );


                    var curver = character.AddComponent <AirMoveCurve>();
                    curver.AireMoveCurve = SingletonManager.Get <CharacterStateConfigManager>().AirMoveCurve;
                    curver.MovementCurve = SingletonManager.Get <CharacterStateConfigManager>().MovementCurve;
                    curver.PostureCurve  = SingletonManager.Get <CharacterStateConfigManager>().PostureCurve;
                    if (character.GetComponent <EntityReference>() == null)
                    {
                        character.AddComponentUncheckRequireAndDisallowMulti <EntityReference>();
                    }
                    character.GetComponent <EntityReference>().Init(player.entityAdapter);
                    var comp = character.AddComponent <PlayerVehicleCollision>();
                    comp.AllContext = _contexts;

                    var appearanceManager = new AppearanceManager();


                    var characterControllerManager = new CharacterControllerManager();
                    characterControllerManager.SetCharacterController(characterControllerContext);


                    var characterBone = new CharacterBoneManager();
                    characterBone.SetWardrobeController(appearanceManager.GetWardrobeController());
                    characterBone.SetWeaponController(appearanceManager.GetController <WeaponController>());
                    var weaponController = appearanceManager.GetController <WeaponController>() as WeaponController;
                    if (null != weaponController)
                    {
                        weaponController.SetWeaponChangedCallBack(characterBone.CurrentWeaponChanged);
                        weaponController.SetCacheChangeAction(characterBone.CacheChangeCacheAction);
                    }
                    player.AddCharacterControllerInterface(characterControllerManager);
                    player.AddAppearanceInterface(appearanceManager);
                    player.AddCharacterContoller(characterControllerContext);
                    player.AddCharacterBoneInterface(characterBone);
                    player.AddRecycleableAsset(character);
                    player.AddPlayerGameState(PlayerLifeStateEnum.NullState);
                }
            }
예제 #22
0
        private void InitialOneScene(UnityEngine.SceneManagement.Scene scene)
        {
            GameObject[] roots = scene.GetRootGameObjects();
            int          c1    = 0;
            int          c2    = 0;
            int          c3    = 0;
            int          total = 0;

            for (int i = 0; i < roots.Length; i++)
            {
                GameObject          obj = roots[i];
                UnityEngine.Terrain t   = obj.GetComponent <UnityEngine.Terrain>();
                if (t == null)
                {
                    Transform[] trans = obj.GetComponentsInChildren <Transform>(true);
                    for (int j = 0; j < trans.Length; j++)
                    {
                        GameObject child = trans[j].gameObject;

                        Vector2 pos = new Vector2(trans[j].position.x, trans[j].position.z);

                        if (Math.Abs(pos.x) < 4000 && Math.Abs(pos.y) < 4000 && pos.magnitude > 1)
                        {
                            try
                            {
                                if (child.name.StartsWith("Prop") || child.name.ToLower().StartsWith("stone") || child.name.StartsWith("prop"))
                                {
                                    if (child.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.SmallthingNear))
                                    {
                                        smallMap.Insert(child, pos);
                                        c1++;
                                    }
                                    else
                                    {
                                        MidMap.Insert(child, pos);
                                        c2++;
                                    }
                                }
                                else
                                {
                                    map.Insert(child, pos);
                                    c3++;
                                }
                                //child.SetActive(false);
                                total++;
                            }
                            catch (Exception e)
                            {
                                _logger.ErrorFormat("culling insert error {0}", e.Message);
                            }
                        }
                    }
                }
            }

            _logger.InfoFormat("culling insert t={4}, s={0},m={1},b={2} at scene {3}", c1, c2, c3, scene.name, total);
        }
        protected override void InitComponent(PlayerEntity player, IContexts contexts)
        {
            var character = DefaultGo.CreateGameObject(player.entityKey.ToString());

            character.layer = UnityLayerManager.GetLayerIndex(EUnityLayerName.Player);
            var cc  = PlayerEntityUtility.InitCharacterController(character);
            var kcc = PlayerEntityUtility.InitKinematicCharacterMotor(character);
            var characterControllerContext = new CharacterControllerContext(
                new UnityCharacterController(cc, ModelLoadHandler.InitActionWithOffset(), !player.isFlagSelf),
                new ProneCharacterController(kcc,
                                             new ProneController(), ModelLoadHandler.InitActionWithNoOffset()),
                new DiveCharacterController(kcc,
                                            new DiveController(), ModelLoadHandler.InitActionWithNoOffset()),
                new SwimCharacterController(kcc,
                                            new SwimController(), ModelLoadHandler.InitActionWithNoOffset())
                );


            var curver = character.AddComponent <AirMoveCurve>();

            curver.AireMoveCurve = SingletonManager.Get <CharacterStateConfigManager>().AirMoveCurve;

            character.AddComponent <EntityReference>();
            character.GetComponent <EntityReference>().Init(player.entityAdapter);
            var comp = character.AddComponent <PlayerVehicleCollision>();

            comp.AllContext = contexts as Contexts;

            var appearanceManager = new AppearanceManager();


            var characterControllerManager = new CharacterControllerManager();

            characterControllerManager.SetCharacterController(characterControllerContext);


            var characterBone = new CharacterBoneManager();

            characterBone.SetWardrobeController(appearanceManager.GetWardrobeController());
            characterBone.SetWeaponController(appearanceManager.GetController <NewWeaponController>());
            var weaponController = (NewWeaponController)appearanceManager.GetController <NewWeaponController>();

            if (null != weaponController)
            {
                weaponController.SetWeaponChangedCallBack(characterBone.CurrentP1WeaponChanged, characterBone.CurrentP3WeaponChanged);
                weaponController.SetWeaponOrAttachmentDeleteCallBack(characterBone.WeaponOrAttachmentDel);
                weaponController.SetWeaponOrAttachementAddCallBack(characterBone.WeaponOrAttachmentAdd);
                weaponController.SetCacheChangeAction(characterBone.CacheChangeCacheAction);
            }
            player.AddCharacterControllerInterface(characterControllerManager);
            player.AddAppearanceInterface(appearanceManager);
            player.AddCharacterContoller(characterControllerContext);
            player.AddCharacterBoneInterface(characterBone);
            player.AddPlayerGameState(PlayerLifeStateEnum.NullState);
            player.AddPlayerResource(character);
        }
예제 #24
0
        public void PlayerDead(bool isSelf = true)
        {
            SetLayer(_characterRoot, UnityLayerManager.GetLayerIndex(EUnityLayerName.NoCollisionWithEntity));
            closeEye();
            if (!isSelf)
            {
                _controller.enabled = false;
            }

            Logger.InfoFormat("PlayerDead :{0}", _characterRoot);
        }
예제 #25
0
 void OnTriggerStay(Collider collider)
 {
     if (collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.VehicleTrigger))
     {
         var vehicle = VehicleEntityUtility.GetVehicleFromChildCollider(collider);
         if (vehicle != null)
         {
             SetCollisionState(vehicle, EVehicleCollisionState.Stay);
         }
     }
 }
        private RayCastTarget MakeCastTarget()
        {
            var go  = new GameObject(DefaultName);
            var col = go.AddComponent <BoxCollider>();

            col.isTrigger = true;
            var target = RayCastTargetUtil.AddRayCastTarget(go);

            go.layer            = UnityLayerManager.GetLayerIndex(EUnityLayerName.UserInputRaycast);
            go.transform.parent = _poolRoot.transform;
            return(target);
        }
예제 #27
0
        private static Vector3 GetNewBirthPositionOnOverlap(GameObject go)
        {
            var position = go.transform.position;

            if (SharedConfig.IsOffline || SharedConfig.IsServer)
            {
                var         rigidBody   = go.GetComponent <Rigidbody>();
                int         tryCount    = 0;
                const float checkRadius = 5.0f;
                while (true)
                {
                    var colliders = Physics.OverlapSphere(position, checkRadius, UnityLayerManager.GetLayerMask(EUnityLayerName.Vehicle));
                    if (colliders.Length == 0)
                    {
                        break;
                    }

                    var colliderCount  = colliders.Length;
                    var noOtherVehicle = true;
                    for (int i = 0; i < colliderCount; ++i)
                    {
                        if (colliders[i].attachedRigidbody != rigidBody)
                        {
                            noOtherVehicle = false;
                            break;
                        }
                    }

                    if (noOtherVehicle)
                    {
                        break;
                    }


                    _logger.WarnFormat("There is a vehicle in birth position {0}", position);
                    tryCount++;
                    var angle = UnityEngine.Random.Range(0, 2 * (float)Math.PI);
                    var dir   = new Vector3(Mathf.Sin(angle), 0.0f, Mathf.Cos(angle));
                    position += checkRadius * tryCount * dir;
                    const float liftHeight = 1000.0f;
                    position.y += liftHeight;

                    RaycastHit hit;
                    if (Physics.Raycast(position, -Vector3.up, out hit, 2 * liftHeight, UnityLayers.SceneCollidableLayerMask))
                    {
                        position = hit.point + new Vector3(0, 2.0f, 0);
                    }
                }
            }

            return(position);
        }
예제 #28
0
        private int?ProcessIgnoreLayers()
        {
            int?lastLayer = null;
            var mySelf    = _playerContext.flagSelfEntity;

            if (null != mySelf && mySelf.hasCharacterContoller)
            {
                var characterController = mySelf.characterContoller.Value.gameObject;
                lastLayer = characterController.layer;
                characterController.layer = UnityLayerManager.GetLayerIndex(EUnityLayerName.User);
            }
            return(lastLayer);
        }
예제 #29
0
            public void OnLoadSucc <T>(T source, UnityObject obj)
            {
                if (_param == null)
                {
                    _dataSource.AddRecycleObject(obj);
                    return;
                }

                if (obj.Address.Equals(_param.P3DefaultResAddr) ||
                    obj.Address.Equals(_param.P1DefaultResAddr))
                {
                    if (_param.DefaultGameObject == null)
                    {
                        _param.DefaultGameObject = obj;
                        SetObjParam(_param.DefaultGameObject, UnityLayerManager.GetLayerIndex(EUnityLayerName.Player));
                    }
                    else
                    {
                        _dataSource.AddRecycleObject(obj);
                    }
                }
                else if (_param.HasAlterAppearance && obj.Address.Equals(_param.AlterResAddr))
                {
                    if (_param.AlternativeGameObject == null)
                    {
                        _param.AlternativeGameObject = obj;
                        SetObjParam(_param.AlternativeGameObject, UnityLayerManager.GetLayerIndex(EUnityLayerName.Player));
                    }
                    else
                    {
                        _dataSource.AddRecycleObject(obj);
                    }
                }
                else
                {
                    _dataSource.AddRecycleObject(obj);
                }

                if (_param.DefaultGameObject != null &&
                    _param.HasAlterAppearance == (_param.AlternativeGameObject != null))
                {
                    _param.PrepareMasks();
                    if (_loadFinishHandle != null)
                    {
                        _loadFinishHandle.Invoke(_param);
                    }
                    _dataSource.FinishLoadResource(_param, _index);
                    _param = null;
                }
            }
예제 #30
0
 private void DoExplosionDamageToColliders(VehicleEntity vehicle, Collider[] colliders, Vector3 explosionCenter)
 {
     foreach (var collider in colliders)
     {
         if (collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.Player))
         {
             DoExplosionDamangeToPlayer(vehicle, collider, explosionCenter);
         }
         else if (collider.gameObject.layer == UnityLayerManager.GetLayerIndex(EUnityLayerName.Vehicle))
         {
             DoExplosionDamangeToVehicle(vehicle, collider, explosionCenter);
         }
     }
 }