2015-02-04 09:53:13 book_longssl 阅读数 816

Mecanim是Unity新增的动画系统,其功能强大而灵活,让人类和非人类角色栩栩如生。Mecanim的重定向极大的提供了工作效率,而且占用极少CPU周期。使用从Unity资源商店找到的动画资源,或把您自己的动画文件(动作捕捉或关键帧)导入编辑器,启动或实现整个项目,并将它们转换为您自己的可重定向的动画资源。

轻松地构建和编辑复杂的状态机和混合树。Unity编辑器提供强大的工具,用于分割、创建循环和从导入的动画文件中提取轨迹。然后可以把这些动画短片用作一个多层混合树的叶子,或者作为分层状态机中的一种状态。混合树让您只使用几个动画剪辑就能创建各种各样的运动。在混合树编辑器中,您可以定义混合参数并在3D视图中预览混合动画。

可以使用自动创建的IK(反向动力学)骨架.

简单地说,由父骨骼的方位和子骨骼的相对变换得到子骨骼的方位,称为正向动力学(Forward Kinematics,FK);而反向动力学(Inverse kinematics,IK)则是先确定子骨骼的方位,反向推导出其继承链上n级父骨骼方位 从而确定整条骨骼链的方法。

MecAnim 角色动画系统中,我们需要通过以下步骤实现Unity中的角色动画:

1.导入角色动画

2.创建角色动画Avatar

3.添加角色动画控制器、设置状态机、设置混合树。

4.实现编码等控制角色动画


2012-12-25 14:57:39 asd237241291 阅读数 3323

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【119706192 本文链接地址: Unity3D Input按键系统

默认输入轴:

  • Horizontal 和 Vertical被映射到w, a, s, d键和方向键
  • Fire1, Fire2, Fire3被分别映射到Ctrl,Option(Alt)Command
  • Mouse X 和 Mouse Y被映射到鼠标移动增量
  • Window Shake X 和 Window Shake Y 被映射到窗口的移动 

添加新的输入轴

添加新的虚拟轴,选择菜单Edit->Project Settings->Input :

  • 名称(Name):名称用于从脚本使用这个轴
  • 描述名称(Descriptive Name):正值名称显示于配置对话框的输入标签,用于独立版。
  • 描述负名称(Descriptive Negative Name):负值名称显示于配置对话框的输入标签,用于独立版。
  • 负按钮(Negative Button):该按钮用于在负方向移动轴  (如:左)
  • 正按钮(Positive Button):该按钮用于在正方向移动轴   (如:右)
  • 备选负按钮(Alt Negative Button):备选按钮用于在负方向移动轴(如:a)
  • 备选正按钮(Alt Positive Button):备选按钮用于在正方向移动轴 (如:d)
  • 重力(Gravity):当没有按钮被按下,在单位每秒速度,轴下降到0。
  • 死亡(Dead):模拟的死区大小。 设定范围内所有模拟设备的值为0。
  • 灵敏度(Sensitivity):在单位每秒速度,轴将移向目标值。这近用于数码设备。
  • 捕捉(Snap):如果启用,当按下相反方向的按钮,该轴值将重设为0。
  • 反向(Invert):如果启用,负按钮将提供一个正值,反之亦然。
  • 类型(Type):控制轴的输入设备类型
  • 轴(Axis):连接设备的轴将控制这个轴 (因为上面正负按钮设置的是左右,所以这里要选X轴)
  • 操作杆(Joy Num)连接操纵杆将控制这个轴

移动设备输入

Unity 为你提供访问iOS/Android系统的Input 和 iOS Input脚本接口。

多点触控

触控列表(Input.touches):返回上一帧所有触控状态的对象列表(Touch[]:单个触摸状态)。

触控状态(TouchPhase):(例子:if(touch.phase != TouchPhase.Began))

  • Began:手指已触摸屏幕。
  • Moved:手指在屏幕上移动。
  • Stationary:手指触摸屏幕,但并没有移动。
  • Ended:手指从屏幕上移开。这是一个触摸的最后状态。
  • Canceled:系统取消跟踪触摸,如用户把屏幕放到他脸上或超过五个接触同时发生。这是一个触摸的最后状态。

设备面朝方向

Input.deviceOrientation : (例子:if (Input.deviceOrientation == DeviceOrientation.FaceDown))

  • Unknown:设备的方向不能被确定。
  • Portrait:设备在纵向模式,设备直立并home按钮在底部。
  • PortraitUpsideDown:设备在纵向模式,但颠倒一下,设备直立并home按钮在顶部。
  • LandscapeLeft:设备在横向模式,设备直立并home按钮在右边。
  • LandscapeRight:设备在横向模式,设备直立并home按钮在左边。
  • FaceUp:设备保持与地面平行,屏幕的面向上。
  • FaceDown:设备保持与地面平行,屏幕的面向下。

加速传感器

Input.acceleration :竖直拿着设备(home按钮在底部),X轴指向右,Y轴指向上,Z轴指向前。

加速度传感器数值可能被颠簸影响。应用低通过过滤器可以是它平滑,摆脱干扰。

复制代码
//加速器刷新间隔
float AccelerometerUpdateInterval = 1.0f / 60.0f;
//值越大, 被过滤值将汇集当前输入采样越慢
float LowPassKernelWidthInSeconds = 1.0f; 

//过滤范围
private float
LowPassFilterFactor = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; private Vector3 lowPassValue = Vector3.zero; void Start () { lowPassValue = Input.acceleration; } //过滤方法 (获取加速量调用此方法即可) Vector3 LowPassFilterAccelerometer(){ lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor); return lowPassValue;
}
复制代码

 


GPS地理位置定位

通过iPhoneSettings.StartLocationServiceUpdates()方法开始定位服务的更新。最后通过iPhoneInput.lastLocation可以收回位置坐标变量。

API: static void StartLocationServiceUpdates ( float desiredAccuracyInMeters = 10f,float updateDistanceInMeters = 10f)

参数1:desiredAccuracyInMeters - 理想服务精确度(单位是米)。使用更高的值像500通常不需要打开GPS芯片从而保持电池电量,像5-10的值可以被用来得到最好的精确度。默认值是10米。

参数2:updateDistanceInMeters - 最小的距离(单位是米)的一种服务在横向移动之前必须更新iPhoneInput.lastLocation属性。像500意味着更少的开销。默认的是10米。

复制代码
void Start () {
    // 开始服务在查询定位之前
    iPhoneSettings.StartLocationServiceUpdates();

   // 等待知道服务初始化
  //iPhoneSettings.locationServiceStatus为当前服务状态
int maxWait = 20; while (iPhoneSettings.locationServiceStatus == LocationServiceStatus.Initializing && maxWait > 0) { yield return WaitForSeconds(1); maxWait--; } // 在20秒内服务没有初始化 if (maxWait < 1) { print("Timed out"); return; } // 用户拒绝访问定位服务 if (iPhoneSettings.locationServiceStatus == LocationServiceStatus.Failed) { print("User denied access to device location"); return; } // 被给予许可并且定位数值可以取回 else { print("Location: " + iPhoneInput.lastLocation.latitude + " " + iPhoneInput.lastLocation.longitude + " " + iPhoneInput.lastLocation .altitude+ " " + iPhoneInput.lastLocation.horizontalAccuracy + " " + iPhoneInput.lastLocation.timestamp); } // 如果不需要持续查询刷新定位停止服务 iPhoneSettings.StopLocationServiceUpdates(); }
2019-04-23 16:59:45 cjc52294 阅读数 621

接受目前的项目的时候,游戏角色已经有一套完整的动作动画以及逻辑。但是由于逻辑过于凌乱,并且用了新的骨骼,动画也重新由外包发了一份,所以我重新导入了所有的动画并且重写了角色的动作逻辑。

默认导入的FBX动画是 Generic 类型的,对于动画只能调节 循环 相关(以及下面一个我不知道做什么用的选项)。

由于外包动作制作不规范,有一定的位移和角度偏差量,我直接改成了 Humanoid 对这些偏差量进行调节。

之后就使用了这套动作动画大概两个月。制作人一直不太满意这个跳跃,最近招了新的动作兄弟,所以就改了新的跳跃动作。

新的动作给我之后,跑进逻辑里发现在跳跃结束的时候发现人物向后位移了一小段才回到 idle。

交流之后从动作兄弟那里知道,现在基本不使用 Humanoid 制作动画。另外我们一直以为这个回到 idle 的位移是我们的问题,花了两天在自己身上找原因,直到突然想起来看 idle 的 FBX 文件,发现是外包给过来的 idle 动画中人物并不在原点上。动作哥们把 idle 动画修改回原点之后一切恢复正常。

2018-11-15 14:42:01 qq_43667944 阅读数 2176

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

游戏中的角色动作都是怎么做的?怎么样从一个动作切换到另一个动作?

找到Unity Demo中的一个动画资源(FBX) 如下图:


把Male拖入到Scene中,调整摄像机位置。



查看Male的属性

1框 表示当前选择的默认动画,运行后播放的默认动画就是选择的 walk

2框 表示当前模型里面有5个动画,也就是这个人物有5个动作


如何切换动作?我们通过代码来控制。很简单。

新建一个Script,挂载到Male上。

using UnityEngine;using System.Collections;public class MotionControl : MonoBehaviour// Use this for initialization void Start () {  }  // Update is called once per frame void Update () {  if(Input.GetKey(KeyCode.W))  {   animation.Play("walk");  } }}

主要的函数就是

animation.Play("walk");

参数就是动作的名字,在属性栏就可以看到。


按下 W 键,主角就从默认动画切换到了 Walk 动画。


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述
2015-07-13 18:30:14 ynnmnm 阅读数 4942

最近在调战斗时的动画与特效,Unity3D对加/减速提供了Time.timeScale支持。但是,timeScale提供的是全局的时间缩放,而我们有些动作或动画是不希望被timeScale加减速的。比如,《刀塔传奇》中播放大招时,除了大招特效,所有别的动作/动画都暂停。

下面分别是Animation、Animator和粒子特效的ignoreTimeScale方法。

Animation

Time.realtimeSinceStartup记录是不受timeScale影响的真实时间,利用它来在每一帧采样播放Animation。代码片段如下:

AnimationState animState = animation[clipName]; // 当前动画状态

curTime = Time.realtimeSinceStartup; // 当前真实时间
deltaTime = curTime - lastFrameTime; // 此帧与上一帧的时间间隔
lastFrameTime = curTime; // 记录此帧时间,下一帧用
progressTime += deltaTime; // 动画已播放时间
animState.normalizedTime = progressTime / currState.length; // 动画规范化时间[0-1]
animation.Sample(); // 在当前状态对动画进行采样,当你想显式设置动画状态并且对它取样的时候使用

Animator

Animator _animator = ...;
public void Update() {
    _animator.updateMode = AnimatorUpdateMode.UnscaledTime; // 指定该Animator更新模式为不受scale影响
}

粒子特效

对于ParticleEmitter

ParticleEmitter _emitter = ...;
public void Update() {
    _emitter.Simulate(Time.unscaledDeltaTime);
}

对于ParticleSystem

ParticleSystem _particleSystem = ...;
public void Update() {
    _particleSystem.Simulate(Time.unscaledDeltaTime, true, false);
}
没有更多推荐了,返回首页