public void UpdateViewEntity() { List <int> curViewEntities = NetManager.Instance.server.entityManager.GetAroundEntity(inChunkPos, viewWidth); for (int i = 0; i < curViewEntities.Count; i++) { //如果原先已经包含了该玩家,那么跳过 if (viewEntities.Contains(curViewEntities[i])) { RemoveViewEntity(curViewEntities[i]); continue; } else { //如果看见其他怪物了,其他怪物的应用需要更新 ClientEntity otherEntity = NetManager.Instance.server.entityManager.GetEntity(curViewEntities[i]); otherEntity.AddViewPlayer(id); //通知当前玩家,有entity进入视野 EntityJoinViewPackage entityJoinViewPackage = PackageFactory.GetPackage(PackageType.EntityJoinView) as EntityJoinViewPackage; ClientEntityInfo info = new ClientEntityInfo(); info.aoId = otherEntity.aoId; info.type = otherEntity.type; info.entityId = otherEntity.entityId; info.position = otherEntity.position; info.extData = otherEntity.extData; info.roleId = otherEntity.hostPlayer == null ? -1 : otherEntity.hostPlayer.id; entityJoinViewPackage.info = info; this.worker.SendPackage(entityJoinViewPackage); //更新当前entity所属 otherEntity.CheckViewHold(); } } //剩下的怪物都是看不见的了 for (int i = 0; i < viewEntities.Count; i++) { ClientEntity otherEntity = NetManager.Instance.server.entityManager.GetEntity(viewEntities[i]); otherEntity.RemoveViewPlayer(id); //通知玩家,有entity退出视野 EntityLeaveViewPackage entityLeaveViewPackage = PackageFactory.GetPackage(PackageType.EntityLeaveView) as EntityLeaveViewPackage; entityLeaveViewPackage.aoId = otherEntity.aoId; entityLeaveViewPackage.type = otherEntity.type; this.worker.SendPackage(entityLeaveViewPackage); //更新当前entity所属 otherEntity.CheckViewHold(); } //最后更新自己能看见的人 viewEntities = curViewEntities; }
public void InitPosition(Vector3 position) { _position = position; inChunkPos = Terrain.GetChunkPos(position); //初始化人物视野 viewPlayers = NetManager.Instance.server.playerManager.GetAroundPlayer(this, viewWidth, false); for (int i = 0; i < viewPlayers.Count; i++) { ClientPlayer clientPlayer = NetManager.Instance.server.playerManager.GetPlayer(viewPlayers[i]); clientPlayer.AddViewPlayer(id); } viewEntities = NetManager.Instance.server.entityManager.GetAroundEntity(inChunkPos, viewWidth); for (int i = 0; i < viewEntities.Count; i++) { ClientEntity clientMonster = NetManager.Instance.server.entityManager.GetEntity(viewEntities[i]); clientMonster.AddViewPlayer(id); } }