image

[TOC]

2018-2-26

Unity2D中的点击判定

1
2
3
4
5
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
if (hit.collider != null)
{
//code here
}

注意,参与判断物体必须有Collider2d组件。

Spine动画播放

1
2
pet.GetComponent<SkeletonAnimation>().AnimationState.SetAnimation(0,"surprise",false);
pet.GetComponent<SkeletonAnimation>().AnimationState.AddAnimation(0, "idle_2", false,0);

Unity中的Spine事件帧

1
m_cup.GetComponent<SkeletonAnimation>().state.Event += HandleEvent;
1
2
3
4
5
6
7
void HandleEvent(Spine.TrackEntry entry, Spine.Event e)
{
// Play some sound if the event named "footstep" fired.
if (e.Data.Name == "start")
{
}
}

发布Windows版本制定屏幕大小

Main函数的Start方法中加入:

1
Screen.SetResolution(640,1136,false);

2018-2-27

UGUI的按钮点击事件

http://www.cnblogs.com/isayes/p/6370168.html 介绍了Unity中几种不同的按钮点击事件绑定方法,其中第一种方法最为常用。在场景中添加按钮之后,在右边Inspector界面的Onclick中绑定事件:

image2

其中左边应选择所要执行脚本所绑定的GameObject,然后再选择右边相应的方法

2018-3-13

Spine动画帧事件回调中传递参数

Spine Unity库中提供的捕获动画帧事件的方法如下:

1
2
3
4
5
6
7
8
9
10
void Start () {
skeletonAnimation.AnimationState.Event += HandleEvent;
}
void HandleEvent (Spine.TrackEntry trackEntry, Spine.Event e) {
if (e.Data.Name == "event_name") {
Debug.Log("do something here");
}
}

然而这个方法并没有提供自定义参数的接口,如果想在HandleEvent中获取发出此EventGameObject,或者想要传入其他参数,则不能实现。此项目中需要在各个杯子动画播放的特定事件帧的时候身边产生一个宠物,用此方法实现起来不方便。
解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
ani = hit.collider.gameObject.GetComponent<SkeletonAnimation>();
if (ani != null)
{
Spine.AnimationState.TrackEntryEventDelegate action = (Spine.TrackEntry entry, Spine.Event e) =>
{
if (e.Data.Name == "appear")
{
m_petSpawner.createAPetAt(hit.collider.gameObject.transform.position;
}
};
ani.state.Event += action;
}

2018-3-24

Spine动画叠加颜色

游戏中需要实现一个功能:被选中的动画亮起来,而未被选中的则变暗,Sprite可以直接调整颜色,而Spine动画中并没有这个接口。更改纹理颜色也不方便。解决方案:

1
2
3
4
5
6
7
8
9
10
11
public void Flash () {
if (mpb == null) mpb = new MaterialPropertyBlock();
if (meshRenderer == null) meshRenderer = GetComponent<MeshRenderer>();
meshRenderer.GetPropertyBlock(mpb);
int fillPhase = Shader.PropertyToID(fillPhaseProperty);
int fillColor = Shader.PropertyToID(fillColorProperty);
mpb.SetColor(fillColor, flashColor);
mpb.SetFloat(fillPhase, 0.5f);
meshRenderer.SetPropertyBlock(mpb);
}

2018-4-9

Spine动画监听播放完毕

1
2
3
4
5
6
7
8
9
m_animation.AnimationState.Complete += delegate (Spine.TrackEntry entry) {
if (entry.animation.name == "leave_1")
{
clean();
}
};
m_animation.AnimationState.SetAnimation(0, "appear", false);
m_animation.AnimationState.AddAnimation(0, "idle_1", false,0);
m_animation.AnimationState.AddAnimation(0, "leave_1", false, 0);

关于动画的trackIndex

在上面的代码中
m_animation.AnimationState.AddAnimation(0, "idle_1", false,0)
第一个参数是trackIndex。其用法在此:

所谓通道Track,就是把动画分层,让角色在同一时间可以播放几个Spine动画。高层级的通道会覆盖低层级的Track:越大的通道数字就拥有越高的优先级。我觉得和PS里面的图层概念很像。为了方便理解这个通道的概念,可以修改上面的代码。
OBJ.AnimationState:SetAnimation(0, “animation1”, false)
OBJ.AnimationState:SetAnimation(1, “animation2”, false)
这个时候就看不到播放的animation1了,这样写两个动画会同时播放,动画2的层级较高,会直接覆盖掉动画1。