untiy3d action管理机制的编写
使用unity3d对于一些可视化强迫者来说,是一个不错的选择,但unity3d没有cocos2d的action管理机制,比如cocos2dx的CCMoveTo,CCScale等action,所以笔者通过封装action管理来实现类似cocos2dx的actionmanager。
首先需要写一个ActionManager来创建、更新、移除所有action。编写代码实现如下:
using UnityEngine;
using System.Collections;
using System;
public class ActionManager : MonoBehaviour {
private ArrayList actionList = null;
private static ActionManager instance = null;//创建一个ActionManager单例
public static ActionManager Instance
{
get
{
instance = UnityEngine.Object.FindObjectOfType(typeof(ActionManager)) as ActionManager;
if (instance == null)
{
GameObject obj = new GameObject("ActionManager");//每个场景都有一个ActionManager的gameobject来管理所有Action
instance = obj.AddComponent(typeof(ActionManager)) as ActionManager;
instance.InitActionList();
}
return instance;
}
}
public void InitActionList()
{
actionList = new ArrayList();//初始化所有Action容器
}
void Update () {
for (int i = 0; i < actionList.Count;i++ )
{
BasicAction action = (BasicAction)actionList[i];
action.Update();
if(action.bCompleted)//bComplete变量用于判断action是否回收
{
actionList.RemoveAt(i);
i--;
}
}
}
public void AddMoveByAction(GameObject obj, Vector3 moveDirection, float moveDistance,Space relative, float useTime,Action cb)
{
actionList.Add(new MoveBy(obj, moveDirection, moveDistance,relative, useTime, cb));
}
public void AddMoveToAction(GameObject obj, Vector3 targetPos, Space relative, float useTime, Action cb)
{
actionList.Add(new MoveTo(obj,targetPos, relative, useTime, cb));
}
public void RemoveActionByGameObject(GameObject obj)//通过gameobject来移除action
{
foreach (BasicAction action in actionList)
{
if (action.myObj.Equals(obj))
{
actionList.Remove(action);
break;
}
}
}
public void RemoveAllAction()//清除所有action
{
actionList.Clear();
}
void OnDestroy()
{
actionList.Clear();
}
在所有action中具有共同的成员变量,所以需要编写基类函数来减少共同的成员变量和函数,编写action的基类BaseAction:
using UnityEngine;
using System.Collections;
public class BasicAction
{
public bool bCompleted = false;//用于判断action是否完成
public GameObject myObj;//action作用的gameobject
public BasicAction(){}
public virtual void Update(){}//update函数,需要子类重写
}
写完基类,就能入手一个action了,以下是一个比较简单的moveby action:
using UnityEngine;
using System.Collections;
using System;
public class MoveBy : BasicAction { //通过具体距离和方向移动
/*
* moveDirection 移动方向
* moveDistance 移动距离
* useTime 使用的时间,单位秒
*/
private Vector3 speed;
private float time;
//private float deltaTime = 0;
private Space myRelative;
private Action mcb=null;
private float deltaDis = 0,speedLen,moveDistance;
private Vector3 targetPos;
public MoveBy(GameObject obj,Vector3 moveDirection,float moveDistance,Space relative,float useTime,Action cb)
{
this.myObj=obj;
this.mcb = cb;
this.myRelative = relative;
this.moveDistance = moveDistance;
this.time = useTime;
moveDirection.Normalize();
if (myRelative == Space.World)
this.targetPos = this.myObj.transform.position + (moveDirection * moveDistance);
else
this.targetPos = this.myObj.transform.localPosition + (moveDirection * moveDistance);
useTime *= (1 / 0.02f);
speed = (moveDirection * moveDistance) / useTime;
speedLen = Vector3.Distance(speed,Vector3.zero);
}
public override void Update()
{
if(myObj==null)
{
bCompleted = true;
return;
}
deltaDis += speedLen;
if (deltaDis >= moveDistance)
{
myObj.transform.localPosition = targetPos;//确保gameobject到达目标点
if (mcb != null)//完成action后可回调callback
mcb();
bCompleted = true;//如果完成当前action,把action标记可以回收
}
else
{
if (myRelative == Space.World)
myObj.transform.position = new Vector3(myObj.transform.position.x + speed.x, myObj.transform.position.y + speed.y, myObj.transform.position.z + speed.z);
else
myObj.transform.localPosition = new Vector3(myObj.transform.localPosition.x + speed.x, myObj.transform.localPosition.y + speed.y, myObj.transform.localPosition.z + speed.z);
}
}
}
使用例子:
ActionManager.Instance.AddMoveByAction(GameObject obj, Vector3 moveDirection, float moveDistance,Space relative, float useTime,Action cb)
以上时一个比较简单的action封装过程,你也可以通过实现多种action封装,比如moveto,rotationto,rotationby等等。
(转载时请注明出处,from 博客园:HemJohn)
untiy3d action管理机制的编写的更多相关文章
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- IOS- 内存管理机制
iOS平台内存常见问题 作为iOS平台的开发者,是否曾经为内存问题而苦恼过?内存莫名的持续增长,程序莫名的crash,难以发现 的内存泄漏,这些都是iOS平台内存相关的常见问题:本文将会详细介绍iOS ...
- Android内存进程管理机制
参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...
- 正确认识Android的内存管理机制,合理关闭进程 (一)
随着大家收货后会有很多乐粉晒内存,为啦方便大家,在网上搜集了一些相关Andriod管理的相关机制合理管理内存,整理下发个贴. 首先要知道Android系统是基于Linux 2.6内核开发的开源操作系统 ...
- IOS中内存管理机制浅解
我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是 由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得 ...
- JVM介绍&自动内存管理机制
1.介绍JVM(Java Virtual Machine,Java虚拟机) JVM是Java Virtual Machine的缩写,通常成为java虚拟机,作为Java可以进行一次编写,到处执行(Wr ...
- Spark内存管理机制
Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行 ...
- Android包管理机制(一) PackageInstaller的初始化
前言 包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一. 包指的是Apk.jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一 ...
- Linux中断管理 (1)Linux中断管理机制
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
随机推荐
- 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
传送门 公式太长了……我就直接抄一下这位大佬好了……实在懒得打了 首先据说$d(ij)$有个性质$$d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]$$ 我们所求的答案为$ ...
- [Xcode 实际操作]六、媒体与动画-(13)使用UIImageView制作帧动画
目录:[Swift]Xcode实际操作 本文将演示如何将导入的序列图片,转换为帧动画. 在项目导航区打开资源文件夹[Assets.xcassets] [+]->[Import]->选择图片 ...
- 关于APICloud使用心得(原创)
从最开始接触APICloud到现在已经有一段时间了.现在想说说自己对于APICloud开发移动端的想法,既有利又有弊. 以下都是我个人的观点. 先说优点吧: 1.APICloud平台文档.视频较多,很 ...
- JPA @MappedSuperclass注解的使用说明(转)
(2011-11-07 11:37:30) 转载▼ http://blog.sina.com.cn/s/blog_7085382f0100uk4p.html 标签: 杂谈 基于代码复用和模型分离的 ...
- easyui---datalist相关知识
datalist 笔记: class:class="easyui-datalist" //对应标准元素:ul 表格线:lines="true" 远程数据绑定: ...
- HDU-1845-Jimmy's Assignment
链接:https://vjudge.net/problem/HDU-1845 题意: 给一个有向图,求最大匹配. 思路: 有相图的最大匹配,可以通过加上反向边, 求这个无向图的最大匹配, 原图的最大匹 ...
- input密码自动填充
自动填充样式修改 input: -webkit - autofill, input: -webkit - autofill: hover, input: -webkit - autofill: foc ...
- 047 Permutations II 有重复数字的全排列
给定一个可能包含重复数字的集合,返回所有可能的不同全排列.例如,[1,1,2] 有以下不同全排列:[ [1,1,2], [1,2,1], [2,1,1]] 详见:https://leetcode ...
- PHP开发环境及搭建
自学PHP中,很多东西都不熟悉,在此做个记录,方便以后再次搭建PHP环境.这篇文章基本按照原文 ThinkPHP5开发环境安装和配置 ,在此感谢该作者 一.实验目的 1.掌握ThinkPHP5(简称 ...
- Java运算符、引用数据类型、流程控制语句
1运算符 1.1算术运算符 运算符是用来计算数据的符号. 数据可以是常量,也可以是变量. 被运算符操作的数我们称为操作数. 算术运算符最常见的操作就是将操作数参与数学计算: 运算符 运算规则 范例 结 ...