Day 2018.1.9:

拖拽卡牌:

因为卡牌的操作都在UI层,所以放在Canvas里处理,由CardPanel动态添加卡牌。卡牌的预设组件本来只有SpriteRender,但是这个组件并不能响应 OnBeginDrag, OnDragOnEndDrag事件,最后将Card预设改成UGUI系统中的Image,才响应成功,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine;
public class Card:MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private Vector3 m_startPos;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void OnBeginDrag(PointerEventData eventData)
{
m_startPos = gameObject.GetComponent<RectTransform>().position;
Transform parentTransform = transform.parent.transform;
//参数为物体在当前所在的子物体列表中的顺序
//count-1指把child物体在当前子物体列表的顺序设置为最后一个,0为第一个
int count = parentTransform.childCount;
transform.SetSiblingIndex(count - 1);
}
public void OnDrag(PointerEventData eventData)
{
SetDraggedPosition(eventData);
}
private void SetDraggedPosition(PointerEventData eventData)
{
var rt = gameObject.GetComponent<RectTransform>();
// transform the screen point to world point int rectangle
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
{
rt.position = globalMousePos;
}
}
public void OnEndDrag(PointerEventData eventData)
{
gameObject.GetComponent<RectTransform>().position = m_startPos;
}
}

卡牌层级:

其中在OnBeginDrag方法中的两行:

1
2
int count = parentTransform.childCount;
transform.SetSiblingIndex(count - 1);

是因为在拖拽的过程中,先添加的卡牌总被后添加的遮挡,即便把每次拖拽的卡片的位置设置到离摄像头最近也不行。于是只能更改在Hierarchy窗口的层级。

缓动类:

Unity没有自带的类似CocosMoveTo之类的缓动方法,只能借助第三方缓动类。这次项目采用的是DoTween,用法类似Flash AS中的Tween Lite.

1
transform.DOMove(m_staticPos, 0.4F).SetEase(Ease.OutBack).OnComplete(prepared);

更换Image图片:

一般的做法:

1
2
3
Image icon = transform.Find("icon").GetComponent<Image>();
Sprite sp = Resources.Load("Textrues/test", typeof(Sprite)) as Sprite;
icon.sprite = sp;

需要注意的是Resources.Load 会读取Assets中Resources目录下的资源, Resources目录需要手动创建

Day 2018.1.10:

动态加载Spine文件

游戏里需要用到根据配置表来读取某个角色的动画内容然后加载到舞台上,虽然Unity是基于Prefab来动态加载物体,但是要把所有的Spine动画做成Prefab显然是不合理的,这就需要建立一个包含Spine组件的Prefab然后给这个组件动态赋值。借助于Unity中Resource功能的强大,最后的解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
public GameObject createAEntity(int id,Vector3 pos,Quaternion rotation)
{
GameObject obj;
obj = Instantiate(m_entityPre, new Vector3(pos.x,pos.y,pos.y / 10), rotation);
SkeletonDataAsset assets = Resources.Load("Animation/js_enemy_4/js_enemy_4_SkeletonData", typeof(SkeletonDataAsset)) as SkeletonDataAsset;
obj.GetComponent<SkeletonAnimation>().skeletonDataAsset = assets;
SkeletonAnimation ske = obj.GetComponent<SkeletonAnimation>();
ske.Initialize(true);
ske.initialSkinName = "skin1";
ske.AnimationState.SetAnimation(0,"enemy_move_1",true);
ske.loop = true;
return obj;
}

其中 m_entityPre 为一个包含SpineAnimation组件的物体。

类的继承:

游戏的战斗单位总类为Entity,但是各个英雄肯定有自己的类,需继承自EntityUnity的继承与C++类似,但是在子类调用父类的同名方法时,要用base:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Chef : Entity {
// Use this for initialization
new void Start () {
m_movingSpeed = 0.007F;
base.Start();
}
// Update is called once per frame
new void Update () {
base.Update();
}
}

Day 2018.1.11:

Unity世界坐标与屏幕坐标之间如何转换

代码如下:

1
2
3
4
5
Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position); // 目的获取z,在Start方法
Vector3 mousePos = Input.mousePosition;
mousePos.z = screenPos.z; // 这个很关键
Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
this.transform.position = worldPos;

Day 2018.1.15:

Unity2D中的图片锚点

cocos中对于精灵的锚点的改变是通过SetAnchorPoint方法来执行,可以在创建之后来改变锚点。而Unity中是直接对导入的图片资源进行设置。点击图片资源之后,Inspector界面会有一个Sprite Mode的属性,下面有个Pivot,这就是来选择锚点的地方。

Day 2018.1.24:

Unity修改透明度:

1
spriterender.color = new color(r,g,b, a);

第四个参数为 alpha参数的值域为0~1

  • Day 2018.1.9:
    - [拖拽卡牌:](#拖拽卡牌)
    - [卡牌层级:](#卡牌层级)
    - [缓动类:](#缓动类)
    - [更换Image图片:](#更换image图片)
    
  • Day 2018.1.10:
    - [动态加载Spine文件](#动态加载spine文件)
    - [类的继承:](#类的继承)
    
  • Day 2018.1.11:
    - [Unity世界坐标与屏幕坐标之间如何转换](#unity世界坐标与屏幕坐标之间如何转换)
    
  • Day 2018.1.15:
    - [Unity2D中的图片锚点](#unity2d中的图片锚点)
    
  • Day 2018.1.24:
    - [Unity修改透明度:](#unity修改透明度)