unity5中transform.position.zlocalposition一定要加游戏对象吗

工具修订记录最近更改媒体管理器网站地图登录注册&
UnityEngine
UnityEngine.SceneManagement
场景管理类
script:unityengine:classes:transform:transform.localposition
Transform.localPosition 局部位置
JavaScript =>
var localPosition: Vector3;
C# => Vector3 localP
Description 描述
Position of the transform relative to the parent transform.
相对于父级的变换的位置。
If the transform has no parent, it is the same as Transform.position.
如果该变换没有父级,那么等同于Transform.position。
JavaScript:
// Move the object to the same position as the parent:
transform.localPosition = Vector3(0, 0, 0);
// Get the y component of the position relative to the parent
// and print it to the Console
print(transform.localPosition.y);
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
void Example() {
transform.localPosition =
Vector3(0, 0, 0);
print(transform.localPosition.y);
Note that the parent transform's world rotation and scale are applied to the local position when calculating the world position. This means that while 1 unit in Transform.position is always 1 unit, 1 unit in Transform.localPosition will get scaled by the scale of all ancestors.
注意当计算世界的位置时,父级变换的世界旋转和缩放被应用到自身的位置。意思是说Transform.position的1个单位是1个单位,Transform.localPosition的1个单位将由所有父级的缩放获得缩放,简单来所自身位置的1单位将受它所有上级的缩放影响。UNITY 复制对象后局部坐标和世界坐标的变化问题
时间: 23:43:34
&&&& 阅读:52
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&void&Start&()&{&&&&&&&&var&pgo&=&transform.Find&("Button").gameObject;
     obtn&=&Instantiate&(pgo);&&&&&&&&//obtn&=&Instantiate&(pgo, pgo.transform.Parent);    &&&&&&&&var&pos&=&obtn.transform.position;&&&&&&&&//obtn.transform.localPosition&=&Vector3.zero;&&&&&&&&Debug.LogFormat&("1:{0},{1},{2}",&pos.x,&pos.y,&pos.z);&&&&&&&&pos&=&obtn.transform.localPosition;&&&&&&&&//obtn.transform.localPosition&=&Vector3.zero;&&&&&&&&Debug.LogFormat&("2:{0},{1},{2}",&pos.x,&pos.y,&pos.z);&&&&&&&&obtn.transform.SetParent&(pgo.transform.parent);&&&&&&&&obtn.name&=&"cpobj";&&&&}1,复制对象是将原来对象原封不会的拷贝一份。
2,复制后得到的对象没有父结点,因此其世界坐标和局部坐标一样,局部坐标又和原对象局部坐标一样。
因此,复制得到的对象的局部坐标成为了世界坐标。
3,setparent不会改变物体的世界坐标,这符合直观感受。
那么,为了保证不改变物体的世界坐标,在设置了父结点后,物体的局部坐标就会发生改变。
简单来说:结点P下有一个子结点A,复制A得到B,设置B的父结点也为P,这时A与B并不会在相同的位置。
B的世界坐标为A的局部坐标的数值。这就是以上三条规则导致的。
或者:使用obtn&=&Instantiate&(pgo, pgo.transform.Parent);在复制时直接指定父结点,这样复制得到的对象就和原对象在同一位置了。标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!unity3D-游戏/AR/VR在线就业班 unity引擎 - 蛮牛教育 - 国内最大的Unity在线学习平台|Unity培训|Unity3d培训|Unity视频学习|Unity教程 Unreal 虚幻 AR VR - Powered By EduSoho
using System.C
using System.Collections.G
using UnityE
public class bhc : MonoBehaviour {
//在场景中鼠标点击地面后,角色可以移动到目标位置
private Vector3//目标位置
private bool isOver=//移动是否结束
void Update ()
if(Input.GetMouseButtonDown(0))
//1.获取鼠标点击时的目标点
//使用射线实现
//1.创建一个射线
//从摄像机发射出一条经过鼠标当前位置的射线
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
//2.发射射线
RaycastHit hitinfo=new RaycastHit();
if(Physics.Raycast(ray,out hitinfo))
// 获取碰撞点的位置
if(hitinfo.collider.name=="Plane")
target=hitinfo.
target.y=0.5f;
//2.让角色移动到目标位置
MoveTo (target);
//让角色移动到目标位置
private void MoveTo(Vector3 tar)
if (!isOver)
Vector3 v1 = tar - transform.
transform.position+=v1.normalized*speed*Time.deltaT
if(Vector3.Distance(tar,transform.position)&=0.1f)
transform.position=
Dynamic Friction动摩擦力
Static Friction静摩擦力
Bounciness弹力
Friction Combine摩擦力结合性:两个物体发生碰撞后摩擦力如何计算
Bounciness Combine弹力结合性:两个物体发生碰撞后弹力如何计算
is trigger碰撞器是否具有触发效果
发生碰撞条件:都有碰撞器,至少哟一个有刚体组件
using System.C
using System.Collections.G
using UnityE
public class test : MonoBehaviour {
void Start()
r = GetComponent&Rigidbody& ();
void Update ()
if(Input.GetKeyDown(KeyCode.P))
//给当前游戏对象添加一个力
r.AddForce(new Vector3(0f,10f,0f));
//给当前对象添加力矩/扭矩,扭矩可以使物体旋转
r.AddTorque(new Vector3(0f,10f,0f));
//给游戏对象在指定位置上添加一个力
r.AddForceAtPosition(new Vector3(0f,10f,0f),new Vector3(0.5f,0.5f,0.5f));
//在指定位置添加一个爆炸力
r.AddExplosionForce(1500f,Vector3.zero,4000f);
drag空气阻力
angular drag角阻力
use gravity使用重力
is kinematic是否使用动力学
interpolate差值:None
Interpolate内差值:通过当前帧上一帧游戏对象的位置来推算当前帧应该处在那个位置
extrapolate外差值:预测游戏对象下一帧游戏对象的位置
collision detection碰撞检测:Discrete离散碰撞检测(每帧)
Continuous 连续碰撞检测,防止高速运动的物体不进行碰撞检测
Continuous Dynammic 连续动态碰撞检测,防止两个物体都是高速运动的物体不进行碰撞检测
Constraints冻结旋转或位置某个轴上的位移
using System.C
using System.Collections.G
using UnityE
public class ri : MonoBehaviour {
// Use this for initialization
void Start () {
Rigidbody rb = GetComponent&Rigidbody& ();
float mass = rb.
float drag = rb.
//空气阻力
rb.angularD
//当前游戏对象是否受到重力影响
//是否使用运动学
rb.freezeR
//是否冻结旋转
// Update is called once per frame
void Update () {
Vector3 v1 = new Vector3(2f,12.7f,21f);
Vector3 v2 = new Vector3(5.7f,11.7f,2.8f);
Vector3.Distance(v1,v2);
Vector3 pos1 = new Vector3(2.5f,9.7f,12f);
Vector3 pos2 = new Vector3(3.2f,1.7f,8.8f);
Vector3.Angle(pos1,pos2);
using System.C
using System.Collections.G
using UnityE
public class agdbua : MonoBehaviour {
public float angleS
void Update ()
if (Input.GetKeyDown (KeyCode.P))
//Time类用过来进行时间控制
float t=Time.
print ("从游戏开始到当前帧,所消耗的总时长"+t+"秒");
//从上一帧开始到当前真结束,这两帧时间间隔
float d = Time.deltaT
print (d);
//让游戏对象每秒钟准确的旋转30度
transform.Rotate(Vector3.up,Time.deltaTime*angleSpeed);
//表示时间流逝的快慢
//1-表示正常时间流逝
//2-表示2倍速
//0-表示时间停止,游戏暂停
float ts = Time.timeS
//求绝对值
int i = Mathf.Abs (-12); //i=12
//求最大值
int m=Mathf.Max(2,4,3);
int ni=Mathf.Min(3,4);
//三角函数
Mathf.Sin();
Mathf.Cos ();
int s = Mathf.Sqrt(4);
如果当前对象有父对象则position是以父对象为原点进行变换的
using System.C
using System.Collections.G
using UnityE
public class Test : MonoBehaviour {
// Use this for initialization
void Start ()
//如果当前对象有父对象则position是以父对象为原点进行变换的
//获取当前脚本所挂载的游戏对象上的transform
//transform
//1.控制游戏对象的位置,旋转,缩放
//transform属性-世界坐标系中的位置
Vector3 pos=transform.
//localposition属性-局部坐标系中的位置
//transform.localP
print (pos);
//一般不直接修改四元数(rotation等)
//transform.
transform.localR
//控制游戏对象的缩放
Vector3 sc = transform.localS
//2.控制游戏对象间的父子关系
//获取/重新指定父对象的transform组件
Transform d = transform.
d.transform.position=new Vector3(5f,4f,2f);
//获取当前游戏对象的根对象(最上面的哪一个对象)
transform.
//获取当前游戏对象
叫做Cube的子对象
transform.Find ("Cube");=transform.FindChild("Cube");
// Update is called once per frame
void Update ()
if (Input.GetKeyDown (KeyCode.P))
transform.position =Vector3.
transform.localScale = new Vector3 (1f,2f,1f);
//变换当前游戏对象位置
transform.Translate(new Vector3(0,1,0));
//Rotate(旋转轴,每次旋转角度),直接在原基础上加角度
transform.Rotate(Vector3.up,10f);
//new Vector3(x轴上旋转角度,y轴上旋转角度,z。。。。)
//eulerAngles直接改变原角度,效果只有第一次执行时能看出来
transform.eulerAngles=new Vector3(0f,45f,0f);
transform.localEulerAngles=new Vector3(0f,45f,0f);
if (Input.GetKeyDown (KeyCode.P))
transform.localPosition =Vector3.
using System.C
using System.Collections.G
using UnityE
public class test : MonoBehaviour {
//Vector3就是一个类,表示向量,向量是既有大小又有方向量
void Start () {
Vector3 v = new Vector3 ();
//x,y,z就是三个方向上的分量
float x = v.x;
float y = v.y;
float z = v.z;
//获取V的单位向向量
//V的长度会变为1但方向不变
v.Normalize();
//返回V方向上的单位向量,但V本身不会发生变化
Vector3 vn = v.
//获取V的长度
float l = v.
//x=0.y=1,z=0
//表示世界坐标系中Y轴正方向上的单位向量
//x=0.y=-1,z=0
//表示世界坐标系中Y轴负方向上的单位向量
//x=1.y=0,z=0
//表示世界坐标系中X轴正方向上的单位向量
//x=-1.y=0,z=0
//表示世界坐标系中X轴负方向上的单位向量
//x=0.y=0,z=1
Vector3. //表示世界坐标系中Z轴正方向上的单位向量
//x=0.y=0,z=-1
//表示世界坐标系中Y轴负方向上的单位向量
//x=0.y=0,z=0
//表示世界坐标系中的原点
Vector3 v1=new Vector3(1.4f,6f,7.2f);
Vector3 v2=new Vector3(2f,6.5f,12.3f);
//求两个向量的夹角
float angle=Vector3.Angle(v1,v2);
Vector3 pos1=new Vector3(4f,2f,11f);
Vector3 pos2=new Vector3(2f,13.6f,8f);
//获取两个点间的距离
float d=Vector3.Distance (pos1,pos2);
//向量点乘
float dd=Vector3.Dot(v1,v2);
//向量叉乘
Vector3 vc= Vector3.Cross(v1,v2);
void Update () {
using System.C
using System.Collections.G
using UnityE
public class Text : MonoBehaviour {
//GameObject-游戏对象类
void Start ()
//获取脚本当前所挂载的游戏对象
//一般来说在属性视图中能够看到或修改的属性,我们都可以在脚本中获取并修改
//1.游戏对象的名字
print (gameObject.name);
gameObject.name = "老王";
//2.获取游戏对象的Tag
print (gameObject.tag);
gameObject.tag = "Player";
//3.获取游戏对象的激活状态
print (gameObject.activeSelf);
//4.设置游戏对象的激活状态
gameObject.SetActive (false);
//5.获取游戏对象身上的组件
CubeController c = gameObject.GetComponent&CubeController& ();
print (c.blabla);
//6.给游戏对象添加指定类型的游戏组件
Light l=gameObject.AddComponent&Light& ();
//7.通过Tag值查找游戏对象
GameObject g=GameObject.FindGameObjectWithTag("Player");
g.name = "老王";
GameObject gg = GameObject.FindWithTag ("Player");
//8.通过游戏对象名查找游戏对象
GameObject g=GameObject.Find("Main Camera");
g.name = "主摄像机";
//10.通过Tag值查找多个游戏对象、
GameObject[] gs = GameObject.FindGameObjectsWithTag("Player");
gs [1].name="主摄像机";
void Update ()
if (Input.GetMouseButton (1))
//9.销毁某个游戏对象
GameObject.Destroy(gameObject,4f);
using System.C
using System.Collections.G
using UnityE
public class Text : MonoBehaviour {
void Start () {
//活取用胡事件要用Input累
void Update () {
//每真都需要监听用户事件
//在当前者一真中,如果用胡按下了 W 就会返回一个true,否ze返回false
if (Input.GetKeyDown (KeyCode.W))
print ("往前走");
//Input.GetKeyDown() 用来监测按键按下的事件
if (Input.GetKeyDown (KeyCode.S))
//print只能在MonoBehaviour的子类中使用,其他情况下只能使用Debug.Log()打印
Debug.Log ("往后退");
//Input.GetKeyUp() 用来监测按键弹起的事件
if (Input.GetKeyUp (KeyCode.Alpha1))
print ("弹起了1键");
//用来检测持续按键的事件
if (Input.GetKey (KeyCode.F))
print ("按下了F键");
//Input.GetMouseButtonDown ()方法用来检测鼠标按下的事件
//参数1代表鼠标右键
//参数0代表鼠标左键
//参数2代表鼠标中键
if (Input.GetMouseButtonDown (2))
print ("按下了鼠标左键");
//Input.GetMouseButtonUp()用来监测鼠标按键弹起的事件
if(Input.GetMouseButtonUp(0))
print ("弹起的鼠标左键");
//监测鼠标按下的事件
if (Input.GetMouseButton (0))
print ("持续按下鼠标左键");
继承于 MonoBehaviour的类叫运行时类
运行时类不能手动实例化
继承于MonoBehaviour 的类叫做运行时类
运行时类特点是都不能实例化
比如A继承于MonoBehaviour,那么
A a=new A(); 是错误的
Awake()每当脚本被加载时调用
在Awake中进行一些初始化操作(和Start初始化 不同 初始化一些公有字段public)
OnEnable()
只在每次激活脚本时调用(eg:计时器的重置,激活脚本就开始计时)
在第一次调用Update之前调用一次start
在Start中做一些初始化操作(初始化一些私有字段private)
每帧调用一次
LateUpdate()
在Update调用完调用LateUpdate(eg:角色移动完,处理角色移动后的逻辑关系)
OnDisable()
取消激活状态后调用
OnDestroy()
脚本在销毁时调用(怪物爆装备)
持续调用 - IMGUI代码需要写在OnGUI方法中
FixedUpdate()
以固定的频率调用,不会受到图像刷新帧速率的影响
一般我们会把处理物理的代码放在这里(处理子弹逻辑时)
1.time类用来进行时间控制
方法是:Time.time;表示从游戏开始到当前帧的时间
2. Time.deltaTime;方法表示从上一帧开始到当前帧结束
这两帧之间的时间间隔
脚本生命周期
1.脚本生命周期
Awake-&OnEnable-&Start-&Update-&LateUpdate-&OnDisable-&OnDestroy
2.脚本调用
Awake中做一些初始化操作,每当脚本被加载时调用一次(初始化public类)
OnEnable在每次激活脚本时调用
Start在第一次调用Update之前调用一次,在Start中做一些初始化操作(主要放private类)
Update是每帧调用一次,用来处理画面逻辑
LateUpdate在Update调用完后调用
OnDisable取消激活状态调用
OnDsetroy被销毁时调用,比如怪物脚本死亡时,产生一些装备脚本
OnGUI持续调用—IMGUI 代码需要卸载OnGUI方法中
FixedUpdate以固定的频率调用,与图像刷新无关,是不会受到图像刷新速率帧频率的影响,一般我们会把处理物理的代码放入其中
预设体(prefab)
1.预设体能够使游戏对象和资源重复使用
2.相同的游戏对象可以使用同一个预设体来创建
3.对预设体进行修改后,所有的游戏对象都会相应修改
playerPrefab:Player的预设体
if(Input.GerKsyDown(KsyCode.p))
{Instantiate(playerPrefab);}//每当按下P键就会在场景中创建一个player游戏对象
//用预设体动态创建游戏对象
if(Input.GerKsyDown(KsyCode.p))
//每当按下P键就会在场景中创建一个player游戏对象
//用预设体动态创建游戏对象
Vector3 pos=new Vector3();
pos.y=0.5f;
pos.x=Random.range(-5f,5f);
//使用Random.range(-5f,5f)方法来产生-5到5之间的随机数
pos.z=Random.range(-5f,5f);
float angle=Random.Range(0f,360f);
Instantiate(playerPrefab,pos,Quaternion.AngleAxis(angle,Vector3.up));
//第一个参数是使用哪个预设体创建游戏对象
第二个参数是创建出的游戏对象初始位置
第三个参数是创建出的游戏对象的初始旋转角度
normalized
Normaliz()
Distance()
Magnitude()
Vector3就是一个类,表示向量,向量既有大小又有方向的量。
Vector3.up:表示世界坐标中的Y轴正方向上的单位向量
Vector3.down:表示世界坐标中的Y轴负方向上的单位向量
Vector3.right:表示世界坐标中的X轴正方向上的单位向量
Vector3.left:表示世界坐标中的X轴负方向上的单位向量
Vector3.forward:表示世界坐标中的X轴正方向上的单位向量
Vector3.back:表示世界坐标中的X轴正方向上的单位向量
Vector3.zero:表示原点
vector3.angle:求两个之间的夹角
vector.Distance(pos1,pos2):获取两个点之间的距离
vector.Dot:向量点乘
vector.Cross:向量差乘
获取V的单位向量:
1.v.Normalize():v的长度变为1,但方向不变
2.v.normalize:返回v方向上的单位向量,但v本身不会发生变化
3.v.magnitude:获取v的长度
碰撞和触发事件
碰撞事件:
发生碰撞的两个物体必须都带有Collider
发生碰撞的两个物体至少有一个带有刚体
发生碰撞的两个物体必须有相对运动
碰撞相关的三个事件:
OnCollisionEnter(Collision other):碰撞开始时会调用一次
OnCollisionExit(Collision other):碰撞结束时调用一次
OnCollisionStay(Collision other):碰撞持续发生的时候调用
监测和谁发生碰撞:
OnCollisionExit(Collision other)
if(string.Equals("Cube2",other.gameObject.name)){}
触发器相关的三个事件:
onTriggerEnter(Collider other):刚刚进入范围时调用一次
OnTriggerStay(Collider other):持续待在触发范围内会一直调用
OnTriggerExit(Collider other):离开触发范围内会调用一次
触发事件的条件:
发生触发的两个物体必须都带有Collider
发生触发的两个物体至少有一个物体的Collider是Trigger,且至少有一个带有刚体
鼠标事件:
OnMouseDown()
OnMouseEnter()
OnMouseDrag()
OnMouseOver()
OnMouseUp()
OnMouseExit()
OnMouseUpAsButton()
OnMouseDown():当鼠标点击下去时调用
onMouseUp():当鼠标取消点击时调用
onMouseDrag():当鼠标持续按下左键不放时调用
onMouseEnter():当鼠标移动到内部时调用
onMouseExit():当鼠标离开内部时调用
onMouseOver():当鼠标持续停留在游戏对象身上的时候调用
onMouseUpAsButton():当我们像点击按钮一样点击游戏对象
游戏对象和基本操作
游戏项目:场景(A)、场景(B)
场景:游戏对象(1)、游戏对象(2)
游戏对象:组件(1)、组件(2)
一个游戏项目由多个场景组成;
在场景中,一个角色、一个模型、一个特效,都是游戏对象。场景就是由多个游戏对象组成的。
每个游戏对象身上都会有多个组件,使游戏对象具备相应的特性、实现相应的功能。
快捷键操作:
1.选中任何游戏对象,按下F键或者双击,都可以定位到该游戏对象
2.按下鼠标右键+WASD键进行场景漫游
3.按下Alt+鼠标左键旋转视角
4.按下鼠标右键旋转视角
5.QWERT工具分别是手形工具、平移工具、旋转工具、缩放工具盒2D工具
开始学习课时
开始学习课时
开始学习课时
开始学习课时
开始学习课时温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我是阿赵,请多多指教!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
/cn/index.html#.WArsoHEYzRI上面有视频介绍龙骨的编辑器使用和游戏中的效果&如果以前用过龙骨的朋友估计对这只小龙会挺有印象的。&这是龙骨的动画编辑器。不过这次我不打算去研究龙骨编辑器的用法,只针对龙骨在unity里面的使用情况进行一些尝试。&以下是我在试用之后的一些体会:一、龙骨在Unity内的表现 龙骨的demo里面带有多个范例,包括了动画播放、换装、控制等等,个人感觉表现力挺不错的,有兴趣可以自己下载来运行看看。换装和控制的demo&&同屏多角色的demo二、对龙骨的资源的一些解释:从龙骨里面导出的文件,会有三个,分别是骨骼配置(skeleton.txt)、图集配置(texture.txt)和图集图片(texture.png)这些文件的格式并不是针对unity的,而是通用的,配置文件是json,然后图片是png。这就是跨平台的用法,在不同的平台可以用通用的动画数据。看看详细的数据结构:这是skeleton.txt里面的内容:包括了版本号、骨骼名称、角色骨骼支架(armature)信息和帧率&接下来详细看看armature的信息:一个armature其实就是一个独立的角色了。这里看到这种结构的原因,说明了龙骨里面,一个skeleton.txt骨骼里面可以包含多个不同的角色,他们是用同一张图集的。&一个armature里面会包含蒙皮信息(skin)、动画信息(animation)和骨骼信息(bone)蒙皮信息&动画信息&骨骼信息
骨骼动画的原理我之前也有介绍过,对于骨骼动画有了解的朋友应该都知道这三个数据是做什么用的。骨骼是一个角色骨架在初始蒙皮状态时候的骨骼位置,蒙皮信息是网格模型皮肤在蒙皮状态时候相对骨骼的位置,还有受到骨骼影响的权重大小。动画信息是每一个关键帧里面骨骼对应的矩阵变化,简单来说就是位移旋转缩放之类的信息。当需要播放骨骼动画的时候,会根据动画信息算出每根骨骼当前帧应该在的位置,然后网格模型皮肤根据蒙皮信息得出网格模型当前帧需要的位移旋转缩放或者形变的情况,然后渲染出来。&接下来是图集图片的配置数据:里面包括了图片对应角色的名称、图片的路径,还有图集里面每一张小图的位置信息:图集配置数据&小图片数据 图集的原理就更简单了,根据小图在大图里面的开始位置和长宽,生成出小sprite。由于这些sprite都是从同一个texture里面生成出来的,那么他们的drawcall就只有一个了。&三、龙骨在unity里面的用法的介绍:下面从代码层级介绍一下龙骨在unity里面的用法。1、加载资源 在使用龙骨播放角色动画之前,需要先把上一个部分说道的骨骼和图集的信息先加载进来。使用的api是 1.加载骨骼信息: UnityFactory.factory.LoadDragonBonesData(骨骼文件(skeleton.txt)在resources里面的相对路径,角色名称) 2.加载图集信息: UnityFactory.factory.LoadTextureAtlasData(图集配置文件(texture.txt)在resources里面的相对路径,角色名称) 加载角色里面有一个角色名称的参数,这个参数是可以不传进去的,因为骨骼和图集里面本身是有角色名称的,如果参数不传,就会以配置里面的角色名称来使用。这个名称是很有用的,如果你指定了角色名称,那么骨骼和图集的角色名称必须要一样。因为他们加载完之后是会存在factory里面的,根据角色名称来找到对应的关系。如果两者名字不一样,就找不到对应关系了。 角色名称还有另外一个用途,就是用于资源卸载的。之后会说。2、创建角色 在确保骨骼动画和图集数据都加载了之后,我们可以创建一个角色 UnityFactory.factory.BuildArmatureComponent(armature的名称) 刚才也说过了,骨骼信息加载完是存在factory里面的,一个骨骼里面包含了多个armature,你就可以通过api把你想要的armature加载出来。这样创建的角色对象,是UnityArmatureComponent对象。就像一般的UnityComponent一样可以直接操作的一些属性,比如transform.localPosition等3、播放动画 获得了UnityArmatureComponent对象之后,就可以直接播放它身上的动画了,用到的API就是 UnityArmatureComponent.animation.Play("动画名称");4、换装 龙骨换装使用的是插槽的方式,先通过UnityFactory.factory.BuildArmature(weaponName)方法生成新的武器的Armature,然后通过 armature.GetSlot("骨骼名称").childArmature = 新武器的Armature5、资源卸载 骨骼数据的卸载:UnityFactory.factory.RemoveDragonBonesData(角色名称,是否回收到池) 图集数据的卸载:UnityFactory.factory.RemoveTextureAtlasData(角色名称,是否回收到池) 看到了刚才指定的角色名称的用途了,在卸载的时候是需要用到的。然后后面有个参数是是否回收。龙骨对于这些数据是做了对象池的,默认是否回收到池是true。不过这个功能有bug。下面会说到。四、使用龙骨的unity程序发布在手机上面的性能分析: 一开始也说到过,现在在Unity3D上面做2D骨骼的插件其实非常多,究竟哪些类型的插件会吸引我去用,主要是有那么几点的: 1、动画编辑的便捷性,也就是说是否有提供友好的编辑工具来很愉快的编辑动画 2、动画的通用性,也即是跨平台性。比如一个项目如果成功了,你会考虑移植到其他平台,比如你会想在开发了一个网页版的游戏成功了之后,把它移植到手机上,那么同样的一套美术资源,你想希望他可以直接用在unity、cocos或者html5上面。 3、运行的效率。刚才说得天花乱坠,骨骼动画的好处非常多,但如果运行效率低下,那么就什么都不必说了。 前两点,龙骨是做得非常好的。那么看看第三点效率的问题。 我把龙骨自带的多人同屏的demo修改了一下,发布成apk,分别在2台手机上面测试了一下单纯骨骼动画的效率,情况如下: 使用的就是上面截图的那个骨骼数据的角色"centaur/charactor",它有18个骨骼。 三星note3 :稳定维持60帧:同屏50个 角色
稳定维持30帧:同屏150个 角色 &红米note1:稳定维持 60帧:同屏45个角色
稳定维持30帧:同屏100个角色 由于龙骨是做2d游戏的,而2d游戏的一般帧率是不会超过30帧的,所以也就是说一般同屏角色数可以达到100个左右。但实际同屏支持数会受到多个方面的影响,比如机器的性能,或者角色骨骼数量的多少。18根骨骼对于2d游戏角色来说算是中等偏上的一个数量吧,除非需要做很写实很多细节的角色,不然一般很少用到30多根骨骼。 以前我自己写的骨骼动画框架,是用在as3上面的,如果单纯正常的播放骨骼动画,没有能达得到这样的同屏数量。但后来我是想了个办法,在加载的时候先把动画的每帧都渲染出来,然后直接播放序列帧。那样做,加载的文件还是很小,并可以做到同屏几百人,但缺点是需要的内存会增大很多,而且不能随意的换装。龙骨在兼顾多种功能的情况下能达到这种效率,我感觉算是不错。不过有空还是要拿其他几个骨骼动画插件做横向对比才能得出准确的结果。五、存在的一些问题: 在试用的过程中,我发现了挺多问题的,估计是因为第一版的关系吧。我这里大概说一下:1、获取骨骼数据和图集数据时候,没有做dictionary是否为空或者是否包含该key的判断,导致如果传入的名字有误会报错2、资源加载方面用了assets路径下面的相对路径,这样会导致发布的时候可能会有问题。而且固定加载resources下面的路径也不是一个好的选择,那样做对于项目资源配置时会觉得不灵活。最好的做法是加载这一步只封装一个纯粹一点的接口,只把加载到的字符串传入,然后生成龙骨数据,至于是怎样加载路径的,可以留给用户自己去决定。3、选择RemoveDragonBonesData回到池里面,由于调用了BaseObject的ReturnToPool方法,里面有_onClear方法是把ArmatureData的_defaultSkin置为了null,却没有把skins设置clear,,再次加载该资源时,在ArmatureData类里面的AddSkin方法,由于skins已经包含了该key,导致设置不了_defaultSkin,而在创建Armature的时候由于_defaultSkin,为空,会报错,不过就算skins设置clear了,还是有其他数据其他的数据没有清空,导致动画错乱,这个暂时没去细看4、批量角色的创建和消耗都会比较耗时,不过这种问题可以通过游戏逻辑里面分帧处理或者在有loading条的时候再批量删除来解决5、估计是龙骨开发人员对Unity的熟悉程度还不算高,在编写的过程中选用api方法有点随意,把一些UnityEditor的方法用上了,导致在发布的时候会出现一些问题。不过这个问题很快就修复了。六、总结 龙骨作为老牌的2d骨骼动画解决方案,在编辑器、跨平台和功能上应该是有一定的保证的,现在刚推出的Unity的支持,其实不算完善,很多方面都有待优化。如果有兴趣的朋友可以留意一下他们的网站更新。龙骨的unity库地址:/DragonBones/DragonBonesCSharp
阅读(1135)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'在Unity3D引擎里使用DragonBone(龙骨)2D骨骼动画',
blogAbstract:'\t之前阿赵我在博客上面介绍过在unity3d里面使用Spine骨骼动画。实际上现在Unity上面开发2D游戏的人非常多,所以2D动画非常受到用户关注。现在Unity3D上面做2D骨骼动画的插件也挺多的。最近,老牌2D骨骼动画解决方案DragonBone(龙骨)也推出支持Unity3D的库,意味着我们也可以在Unity3D里面使用龙骨了。龙骨的优点是有强大的动画编辑器,和可以跨多个平台使用。龙骨的unity支持插件是最近才推出的,阿赵尝了个鲜,下载来用了一下,并做了一些分析。\t如果不了解龙骨的朋友,可以去他们的官网看看:/cn/index.html#.WArsoHEYzRI',
blogTag:'dragonbone,龙骨,unity,骨骼动画',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我是阿赵,请多多指教!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 transform.position 的文章

 

随机推荐