class newnewUI extends UI.UIBehavior {
public _BGP: UI.Image = null;
public _BGT: UI.Image = null;
public _XBtn: UI.StaleButton = null;
public _TitleBtn: UI.StaleButton = null;
public _YesBtn: UI.StaleButton = null;
public _NoBtn: UI.StaleButton = null;
public _Tips: UI.TextBlock = null;
protected onAwake() {
//设置能否每帧触发onUpdate
this.canUpdate = false;
this.layer = UI.UILayerDialog;
let _windowsSize = Util.WindowUtil.getViewportSize();
console.log("this.uiWidgetBase.guid " + this.uiWidgetBase.guid);
Gameplay.getCurrentPlayer().character.moveEnable = false;
this._BGP = UI.Image.newObject(this.uiWidgetBase.rootContent, "BGP");
this._BGT = UI.Image.newObject(this.uiWidgetBase.rootContent, "BGT");
this._XBtn = UI.StaleButton.newObject(this.uiWidgetBase.rootContent, "XBtn");
this._TitleBtn = UI.StaleButton.newObject(this.uiWidgetBase.rootContent, "TitleBtn");
this._YesBtn = UI.StaleButton.newObject(this.uiWidgetBase.rootContent, "YesBtn");
this._NoBtn = UI.StaleButton.newObject(this.uiWidgetBase.rootContent, "NoBtn");
this._Tips = UI.TextBlock.newObject(this.uiWidgetBase.rootContent, "Tips");
// 背景图片
this._BGP.imageGuid = "117894";
this._BGP.size = _windowsSize.clone().multiply(0.5);
this._BGP.position = _windowsSize.clone().multiply(0.25);
this._BGP.imageColor = new LinearColor(0.6, 1, 1);
this._BGT.zOrder += 1;
// 背景图片抬头图片
this._BGT.imageGuid = "117894";
this._BGT.size = _windowsSize.clone().multiply(0.5);
this._BGT.size = new Vector2(this._BGT.size.x, this._BGT.size.y * 0.13);
this._BGT.position = _windowsSize.clone().multiply(0.25);
this._BGT.imageColor = new LinearColor(1, 0.6, 1);
this._BGT.zOrder += 2;
// 提示文本
this._Tips.textHorizontalLayout = 0;
this._Tips.fontSize = 36;
this._Tips.fontColor = new LinearColor(0, 0, 0);
this._Tips.size = _windowsSize.clone().multiply(0.4);
this._Tips.position = _windowsSize.clone().multiply(0.5);
this._Tips.position = new Vector2(this._Tips.position.x * 0.6, this._BGT.position.y + this._BGT.size.y * 1.5)
// 弹窗提示的标题,用btn是因为它自动居中
this._TitleBtn.size = this._BGT.size;
this._TitleBtn.position = this._BGT.position;
this._TitleBtn.normalImageDrawType = 0;
this._TitleBtn.enable = false;
this._TitleBtn.zOrder += 3;
// 关闭的按钮
this._XBtn.text = "×";
this._XBtn.size = _windowsSize.clone().multiply(0.5);
this._XBtn.size = new Vector2(this._XBtn.size.x * 0.1, this._XBtn.size.y * 0.1);
this._XBtn.position = _windowsSize.clone().multiply(0.25);
this._XBtn.position = new Vector2(this._XBtn.position.x + this._BGT.size.x - this._XBtn.size.x - 0.5 * (this._BGT.size.y - this._XBtn.size.y), this._XBtn.position.y + 0.5 * (this._BGT.size.y - this._XBtn.size.y));
this._XBtn.normalImageColor = new LinearColor(1, 0.1, 0.1);
this._XBtn.pressedImagColor = new LinearColor(1, 0.4, 0.4);
this._XBtn.zOrder += 4;
// 确定的按钮
this._YesBtn.size = _windowsSize.clone().multiply(0.5);
this._YesBtn.size = new Vector2(this._YesBtn.size.x * 0.2, this._YesBtn.size.y * 0.15);
this._YesBtn.position = new Vector2(_windowsSize.x * 0.5 + this._YesBtn.size.x * 0.2, _windowsSize.y * 0.75 - this._YesBtn.size.y * 1.5);
this._YesBtn.normalImageColor = new LinearColor(0.1, 1, 0.1);
this._YesBtn.pressedImagColor = new LinearColor(0.4, 1, 0.4);
this._YesBtn.zOrder += 4;
// 取消的按钮
this._NoBtn.size = _windowsSize.clone().multiply(0.5);
this._NoBtn.size = new Vector2(this._NoBtn.size.x * 0.2, this._NoBtn.size.y * 0.15);
this._NoBtn.position = new Vector2(_windowsSize.x * 0.5 - this._NoBtn.size.x * 1.2, _windowsSize.y * 0.75 - this._NoBtn.size.y * 1.5);
this._NoBtn.normalImageColor = new LinearColor(1, 0.1, 0.1);
this._NoBtn.pressedImagColor = new LinearColor(1, 0.4, 0.4);
this._NoBtn.zOrder += 4;
// 给按钮注册点击事件
this.initButtons();
}
protected initButtons() {
//按钮添加点击事件,点击后销毁UI,并让角色能再移动
this._XBtn.onClicked.add(() => {
this.destroyUI();
})
this._YesBtn.onClicked.add(() => {
this.destroyUI();
})
this._NoBtn.onClicked.add(() => {
this.destroyUI();
})
}
// 销毁UI,让角色能再移动
protected destroyUI() {
Gameplay.getCurrentPlayer().character.moveEnable = true;
this.destroy();
}
}
@Core.Class
export default class AdsChangeCloth extends Core.Script {
public static instance: AdsChangeCloth;
@Core.Property({ displayName: "换装的GUID", tooltip: "在工程内容/角色/里选择要换装的角色,右键复制工程内容ID", group: "换装配置" })
public CharGUID: string = "";
@Core.Property({ displayName: "弹窗提示的标题", group: "弹窗UI配置" })
public Title: string = "温馨提示";
@Core.Property({ displayName: "提示文本", group: "弹窗UI配置" })
public TipsText: string = "是否要看视频获取换装?";
@Core.Property({ displayName: "确定文本", group: "弹窗UI配置" })
public BtnYesText: string = "确定";
@Core.Property({ displayName: "取消文本", group: "弹窗UI配置" })
public BtnNoText: string = "取消";
public getTitle(): string {
return this.Title;
}
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
AdsChangeCloth.instance = this;
if (SystemUtil.isClient()) {
if (this.gameObject instanceof Gameplay.Trigger) {
let trr = this.gameObject as Gameplay.Trigger;
trr.onEnter.add((char: Gameplay.Character) => {
// 如果进触发器的是咱自己
if (char == Gameplay.getCurrentPlayer().character) {
let _newUI = UI.UIManager.instance.create(newnewUI);
_newUI._TitleBtn.text = this.Title + "";
_newUI._NoBtn.text = this.BtnNoText + "";
_newUI._YesBtn.text = this.BtnYesText + "";
_newUI._Tips.text = this.TipsText + "";
UI.UIManager.instance.showUI(_newUI);
_newUI._YesBtn.onClicked.add(() => {
this.AdsForChangeCloth();
})
}
else {
// 其他人进去的
console.log("有个撒贝进去了,跟咱没关系");
}
})
}
else {
console.warn("[AdsChangeCloth] 这个脚本只支持挂载在触发器下");
}
}
}
/**
* 换装,纯C端,自动同步给其他客户端
* @param CharGuid 需要换装的guid
*/
public changeCharByGuid(CharGuid: string) {
if (SystemUtil.isClient()) {
Gameplay.asyncGetCurrentPlayer().then((p: Gameplay.Player) => {
let hv2 = p.character.setAppearance(Gameplay.HumanoidV2);
hv2.setAppearanceData([CharGuid], () => {
p.character.setAppearance(Gameplay.HumanoidV2).appearanceSync();
console.log("[AdsChangeCloth] 换装同步完成");
})
})
}
}
public AdsForChangeCloth() {
// 开始准备广告咯
Service.AdsService.getInstance().isReady(Service.AdsType.Reward, (isReady: boolean) => {
// 设置一个变量CanGetReward,来决定玩家是否可以获得奖励
let CanGetReward = false;
// 如果广告准备好了
console.log(isReady);
if (isReady) {
// 准备往客户端播广告
Service.AdsService.getInstance().show(Service.AdsType.Reward, (state: Service.AdsState) => {
// 播广告过程中每发生一次state改变
// 就会回调并走一遍以下的流程
// 因此在下面对state进行判断
// 展示广告失败的时候回调,一般是网络卡顿,
if (state == -1) {
// 建议在这里做容错
// 例如播放失败时
// 维持广告播放按钮
// 提示玩家再点一次试试
}
// 开始展示广告的时候回调,无论是否完成广告播放
if (state == 0) {
// 这里可以用来“保护”玩家
// 顺利开始播放广告后
// 玩家客户端处在一个挂起的状态
// 如有需要,可在此处加一些保护逻辑
// 例如在放广告的时候玩家暂时被传送走
}
// 用户关闭广告界面的时候回调,无论是否完成广告播放
if (state == 1) {
// 这里是广告正常播放情况下最后一个状态
// 因此在这里进行奖励判断是比较合适的
// 建议在这里加上适当的延迟
// 以免因放广告时的游戏挂起
// 导致后续游戏逻辑失效
setTimeout(() => {
// 用户关闭广告界面时,已经看完,可以获得奖励
if (CanGetReward) {
// 关闭界面看完了广告时的逻辑
// this.Character.switchToFlying();
// 这里就是换装逻辑
console.log("[AdsChangeCloth] 换装成功");
this.changeCharByGuid(this.CharGUID);
}
// 用户关闭广告界面时,没有看完,不可以获得奖励
else {
// 关闭界面没看完广告时的逻辑
// this.Character.crouch(true);
}
}, 1000);
}
// // 用户点击了跳过广告的时候回调,无论是否完成广告播放
// if (state == 2) {
// // 广告快看完的时候
// // 会给一个跳过按钮
// // 点击跳过会有这个回调
// // 一般不用在这加逻辑
// }
// // 用户点击了广告里面的内容的时候,无论是否完成广告播放
// if (state == 3) {
// // 看广告时点击了广告里的内容
// // 会有这个回调
// // 一般不用在这加逻辑
// }
// 用户播放广告完成了,无论是否点击了关闭广告界面
if (state == 4) {
// 将是否可以获得奖励变量变成true
// 以便在 state == 1 时进行奖励
// 尽量不要在这给奖励
// 因为回调state=4的时候
// 玩家大概率还在放广告阶段
CanGetReward = true;
}
})
}
else {
// 广告没准备好,或后台还有广告在放(玩家没放完广告就切回游戏)
}
})
}
}
|