- 最后登录
- 2022-10-8
- 注册时间
- 2010-12-6
- 阅读权限
- 100
- 积分
- 14150
- 纳金币
- 76544
- 精华
- 23
|
本文分享UniSWF 入门教程第二部分:分辨率适应与事件监听。原文摘录如下:
前言:
对于有Flash基础的人员来说,uniSWF的出现,无疑是改进了流程。能够轻松有效地做出非常棒的GUI。
没有Flash基础,在项目进展初期会带来不少麻烦。
改变是痛苦的,结果是甜美的,基于此,出一些基础教程,方便大家总结经验,科学选择手头工具。
一,补充基本概念
注册点:
(a):在创建元件或转换时,Flash 会提示选择注册位置,如上图是左上角。那么该元素在容器里的对齐位置将从左上角开始,元素旋转时将以左上角为中心。
一般元素布局时,会以左上角为注册点。围绕元素中心旋转时,可选择中心为注册点。
左图扇形元素 注册点在 底部居中
(b):注册点一旦创建完,并非不可修改。进入相应元素编辑舞台后,选择相应元素,进行拖动,即可改变元素注册位置。
注册点在中心
注册点到了左上
二,点击下载使用素材, hud.7z (151 K 涉及下载在附件) hud.7z,本人使用Flash CS6存储的文件
,分别是
,此部分过程不清楚者,请参考入门教程(一)。
其中要需要注意的是,这里的文本框类型 动态文本框,而非静态文本框和输入文本框,
且嵌入了字体
三,Flash准备OK后,转到unity3d
a,给摄像机,添加 MovieClipOverlayCameraBehaviour,摄像机类型,选择Orthographic
b,创建空物体,命名为UI,
c,给UI物体添加脚本,
复制代码
using UnityEngine;
using System.Collections;
using pumpkin.events;
using pumpkin.display;
using pumpkin.text;
using pumpkin.ui;
public class TestUniSWF01 : MonoBehaviour {
private MovieClip playerArea;
//设置UI缩放值
public float scaleRatio=0.5f;
void Start(){
Stage stage=MovieClipOverlayCameraBehaviour.instance.stage;
MovieClip minimap=new MovieClip("uniSWF/learning/swf/hud.swf:Minimap");
playerArea=minimap.getChildByName<MovieClip>("player");
//缩放UI
minimap.scaleX=minimap.scaleY=scaleRatio;
//MiniMap注册点在元素中心,故有*/2过程
minimap.x=stage.stageWidth-minimap.width/2*scaleRatio-20f;
minimap.y=minimap.height/2*scaleRatio+20f;
stage.addChild(minimap);
}
}
继续完善:
Flash扩充:
SimpleButton嵌入字体,注意嵌入相关字符,不要全部嵌入,浪费资源
相应的Unity3d里,hud2.swf的层出选项里,把Export fonts 勾上
点击下载: hud2.fla.7z (616 K 涉及下载在附件) hud2.fla.7z
脚本如下:
复制代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using pumpkin.display;
using pumpkin.events;
using pumpkin.tweener;
using pumpkin.text;
public class L2 : MonoBehaviour {
private Stage stage;
private MovieClip minimap;
private MovieClip background;
private MovieClip playerArea;
private MovieClip btnContainer;
private Dictionary<string,Handler> menus;
public float scaleRatio=0.5f;
public float angle=0f;
private delegate void Handler();
void Start () {
if(!MovieClipOverlayCameraBehaviour.instance)return;
stage=MovieClipOverlayCameraBehaviour.instance.stage;
background=new MovieClip("learnUniSwf/1/hud2.swf:Background");
//背景全屏制作方法
background.x=-2;
background.y=-2;
background.scaleX=(stage.stageWidth+10)/background.width;
background.scaleY=(stage.stageHeight+10)/background.height;
stage.addChild(background);
minimap=new MovieClip("learnUniSwf/1/hud2.swf:Minimap");
playerArea=minimap.getChildByName<MovieClip>("player");
minimap.scaleX=minimap.scaleY=scaleRatio;
minimap.x=stage.stageWidth-minimap.width/2*scaleRatio-20f;
minimap.y=minimap.height/2*scaleRatio+20f;
stage.addChild(minimap);
BuildButtons();
}
void Update () {
angle+=Time.deltaTime*12f;
//动画,模拟minimap 扫描
playerArea.rotation=angle;
}
void MenuData(){
menus=new Dictionary<string, Handler>();
menus.Add("New Game",HandlerStart);
menus.Add("Continue",HandlerContinue);
menus.Add("Options",HandlerOptions);
menus.Add("Exit",HandlerExit);
}
void BuildButtons(){
MenuData();
btnContainer=new MovieClip("learnUniSwf/1/hud2.swf:SimpleContainer");
stage.addChild(btnContainer);
int i=0;
foreach(KeyValuePair<string,Handler> keyvalue in menus){
MovieClip btn=new MovieClip("learnUniSwf/1/hud2.swf:SimpleButton");
btn.gotoAndStop(1);
btn.looping=false
//按钮子元素对Mouse 不触发事件,很关键,不然下文evt.target将指向Btn内的某元素
btn.mouseChildrenEnabled=false;
btn.y=i*(btn.height+10f);
btn.name=keyvalue.Key;
btn.getChildByName<TextField>("txt").text=btn.name;
btnContainer.addChild(btn);
i++;
}
btnContainer.x=stage.stageWidth/2;
btnContainer.y=(stage.stageHeight-btnContainer.height)/2;
//对按钮父容器进行监听,通过事件的target引用找到按钮
btnContainer.addEventListener(MouseEvent.CLICK,ClickHandler);
btnContainer.addEventListener(MouseEvent.MOUSE_ENTER,OnEnter);
btnContainer.addEventListener(MouseEvent.MOUSE_LEAVE,OnLeave);
}
void HandlerStart(){
Debug.Log("handler start....");
}
void HandlerContinue(){
Debug.Log("handler continue....");
}
void HandlerOptions(){
Debug.Log("handler options....");
}
void HandlerExit(){
Debug.Log("handler exit....");
}
void ClickHandler(CEvent evt){
Handler h=menus[(evt.target as MovieClip).name];
if(h!=null){
h();
}
}
void OnEnter(CEvent evt){
(evt.target as MovieClip).gotoAndPlay(1);
}
void OnLeave(CEvent evt){
//(evt.target as MovieClip).gotoAndStop(1);
}
}
最终结果如上图所示。文中涉及的资源,请通过本页附件下载,更多教程分享尽在web3D纳金网纳金网http://www.narkii.com/
|
|