예제 #1
0
        public T CreateActor <T>(xc.UnitCacheInfo info, Quaternion rot, Monster.CreateParam createParam, bool showFashion = false, Action <Actor> cbResloaded = null) where T : Actor, new ()
        {
            if (mActorSet.ContainsKey(info.UnitID))
            {
                GameDebug.LogError("Actor's key conflict. Type: " + info.UnitID.type + ", UID: " + info.UnitID.obj_idx);
                return(null);
            }

            Vector3 scale = RoleHelp.GetPrefabScale(info);

            T actor = new T(); // Activator.CreateInstance<T>();

            actor.OnCreate(info, createParam);
            mActorSet.Add(info.UnitID, actor);

            if (info.UnitType == EUnitType.UNITTYPE_PLAYER)
            {
                var voaction = (Actor.EVocationType)ActorHelper.TypeIdToRoleId(info.AOIPlayer.type_idx);
                StartCoroutine(actor.mAvatarCtrl.CreateModelFromModleList(info.PosBorn, rot, scale, info.AOIPlayer.model_id_list, info.AOIPlayer.fashions, info.AOIPlayer.suit_effects, voaction, cbResloaded));
            }
            else
            {
                string prefab = RoleHelp.GetPrefabName(info);
//                 if(info.UnitType == EUnitType.UNITTYPE_MONSTER && info.AOIMonster != null)
//                 {
//                     if(info.AOIMonster.type_idx >= 201 && info.AOIMonster.type_idx < 208)
//                     {//守护
//                         prefab = prefab + "_pet_test";
//                     }
//                     else if (info.AOIMonster.type_idx >= 301 && info.AOIMonster.type_idx < 308)
//                     {//坐骑
//                         prefab = prefab + "_mount_test";
//                     }
//                 }
                StartCoroutine(actor.mAvatarCtrl.CreateModelFromPrefab(prefab, info.PosBorn, rot, scale, cbResloaded));
            }

            //actor.transform.position = info.PosBorn;
            actor.AfterCreate();

            return(actor);
        }
예제 #2
0
        //only directly called for local player, initiative ride
        private IEnumerator RideAync()
        {
            mOriginalScale = Vector3.one;

            if (this == null || this.IsDestroy || mOwner == null || mOwner.IsDestroy)
            {
                yield break;
            }

            if (mOwner.mVisibleCtrl != null && mOwner.mVisibleCtrl.VisibleMode != EVisibleMode.Visible)
            {
                yield break;
            }
            if (mOwner.mAvatarCtrl == null)
            {
                yield break;
            }
            if (mCurrentRideId == mDirtyRideId)
            {
                mDirtyRideId = -1;
                yield break;
            }

            //test some situation
            if (!TestRide())
            {
                yield break;
            }

            mCurrentRideId = (uint)mDirtyRideId;
            mDirtyRideId   = -1;

            DBGrowSkin db_skin = DBManager.Instance.GetDB <DBGrowSkin>();

            DBGrowSkin.DBGrowSkinItem skin_item = null;
            if (db_skin != null)
            {
                skin_item = db_skin.GetOneItem(GameConst.GROW_TYPE_RIDE, mCurrentRideId);
            }
            if (skin_item != null)
            {
                if (ClientModel.HasExistResourceActorId(skin_item.ActorId) == false)
                {
                    yield break;//不存在资源
                }
            }

            mIsprocessingRide = true;

            //clone rider
            if (mRiderActor != null)
            {
                if (mRiderActor.transform != null)
                {
                    mRiderActor.transform.parent = null;
                }
            }
            else
            {
                mRiderActor = ClientModel.CreateClientModelByClone(mOwner, null);
                if (this == null || this.IsDestroy || mOwner == null || mOwner.IsDestroy || mRiderActor == null || mRiderActor.IsDestroy)
                {
                    mIsprocessingRide = false;
                    yield break;
                }

                // 设置坐骑的阴影状态
                var rider_shadow_behavior = mRiderActor.GetBehavior <ShadowBehavior>();
                var owner_shadow_behavior = mOwner.GetBehavior <ShadowBehavior>();
                if (rider_shadow_behavior != null && owner_shadow_behavior != null)
                {
                    if (owner_shadow_behavior.ShadowType == ShadowType.REAL_SHADOW)
                    {
                        rider_shadow_behavior.ShadowType = ShadowType.REAL_SHADOW;
                    }
                    else
                    {
                        rider_shadow_behavior.ShadowType = ShadowType.NONE;
                    }

                    rider_shadow_behavior.RealShadow = owner_shadow_behavior.RealShadow;
                }

                while (this != null && this.IsDestroy == false && mRiderActor != null && mRiderActor.IsDestroy == false &&
                       (mRiderActor.mAvatarCtrl == null || mRiderActor.mAvatarCtrl.IsLoading(true)))
                {
                    if (mOwner == null || mOwner.IsDestroy)
                    {
                        mIsprocessingRide = false;
                        yield break;
                    }
                    yield return(null);
                }
            }
            if (this == null || this.IsDestroy)
            {
                yield break;
            }
            if (mOwner == null || mOwner.IsDestroy || mOwner.mAvatarCtrl == null)
            {
                mIsprocessingRide = false;
                yield break;
            }
            // DBGrowSkin db_skin = DBManager.Instance.GetDB<DBGrowSkin>();
            // DBGrowSkin.DBGrowSkinItem skin_item = null;
            //if(db_skin != null)
            //skin_item = db_skin.GetOneItem(GameConst.GROW_TYPE_RIDE, mCurrentRideId);
            mGrowSkinItem = skin_item;
            if (skin_item != null && mOwner != null && mOwner.IsDestroy == false && mOwner.mAvatarCtrl != null)
            {
                string prefab_name = RoleHelp.GetPrefabName(skin_item.ActorId, mOwner.mAvatarCtrl.IsLocalPlayerModel());
                if (string.IsNullOrEmpty(prefab_name))
                {
                    mOwner.mAvatarCtrl.ModelPrefab = null;
                    mIsprocessingRide = false;
                    yield break;
                }
                else
                {
                    mOwner.mAvatarCtrl.ModelPrefab = prefab_name;
                }
            }
            else
            {
                mIsprocessingRide = false;
                yield break;
            }
            if (ActorManager.Instance == null)
            {
                mIsprocessingRide = false;
                yield break;
            }
            yield return(ActorManager.Instance.StartCoroutine(mOwner.mAvatarCtrl.LoadAsync_public()));

            while (this != null && this.IsDestroy == false && mOwner != null && mOwner.IsDestroy == false && mOwner.mAvatarCtrl != null && mOwner.mAvatarCtrl.IsLoading(true))
            {
                yield return(null);
            }
            if (this == null || this.IsDestroy)
            {
                yield break;
            }
            if (mOwner == null || mOwner.IsDestroy || mOwner.transform == null)
            {
                mIsprocessingRide = false;
                yield break;
            }

            if (skin_item != null && mOwner != null && mOwner.IsDestroy == false && mOwner.mAvatarCtrl != null)
            {
                mOriginalScale = mOwner.mAvatarCtrl.ModelScale;
                mOwner.mAvatarCtrl.ModelScale = RoleHelp.GetPrefabScale(skin_item.ActorId);
            }

            //mount
            Transform mountPoint = xc.ui.ugui.UIHelper.FindChildInHierarchy(mOwner.transform, AvatarCtrl.MOUNT_POINT_NAME);

            if (mountPoint == null)
            {
                Debug.LogError(string.Format("mount point not found for {0}", AvatarCtrl.MOUNT_POINT_NAME, mCurrentRideId));
                //mount rider
                mIsprocessingRide = false;
                yield break;
            }
            float height = mountPoint.position.y - mOwner.transform.position.y;

            if (mRiderActor != null && mRiderActor.transform != null)
            {
                mRiderActor.transform.parent           = mountPoint;
                mRiderActor.transform.position         = mountPoint.position;
                mRiderActor.transform.localEulerAngles = new Vector3(0, 0, 0);
                mRiderActor.mAvatarCtrl.ResetElfinObject();
                mRiderActor.mAvatarCtrl.ResetSuitPos();
            }

            //animate
            mRideAnim = ANIMATION_RIDE;
            if (mOwner.IsWalking())
            {
                mOwner.Play(Actor.EAnimation.walk);
            }
            else
            {
                mOwner.Play(Actor.EAnimation.idle);
            }

            //mOwner.PlayLastAnimation_real();
            //mOwner.Play("idle");
            for (int index = 1; index < 3; ++index)
            {
                yield return(null);
            }
            if (this == null || this.IsDestroy)
            {
                yield break;
            }

            //mount rider
            mIsprocessingRide = false;

            if (mOwner == null || mOwner.IsDestroy || mOwner.transform == null || mRiderActor == null || mRiderActor.transform == null)
            {
                yield break;
            }
            mountPoint = xc.ui.ugui.UIHelper.FindChildInHierarchy(mOwner.transform, AvatarCtrl.MOUNT_POINT_NAME);
            Transform bip_transform = xc.ui.ugui.UIHelper.FindChildInHierarchy(mRiderActor.transform, "Bip001");

            if (mountPoint != null && bip_transform != null)
            {
                mRiderActor.transform.localPosition = mountPoint.InverseTransformVector(mountPoint.position - bip_transform.position);
            }

            //VocationInfo info = DBVocationInfo.Instance.GetVocationInfo((byte)mOwner.VocationID);
            string  idle_action_name = GetIdleActionWhenRidingName();
            Vector3 mount_offset     = DBVocationMountInfo.Instance.GetMountOffset((byte)mOwner.VocationID, idle_action_name);

            if (mount_offset.magnitude > 0.001f)
            {
                mRiderActor.transform.localPosition = mount_offset;
            }

            mOwner.ResetEffect();
            if (mOwner.MoveImplement != null)
            {
                mOwner.MoveImplement.OnResLoaded();
            }

            mOwner.OnModelChanged();

            if (mRiderActor.mAvatarCtrl != null)
            {
                mRiderActor.mAvatarCtrl.SetLayer(mOwner.GetLayer());
            }
            if (mRideFinishCallback != null)
            {
                mRideFinishCallback();
                mRideFinishCallback = null;
            }
        }