unity支持c4d的c4d旋转动画画吗

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之FBX模型的载入与人物行走动画的播放(十二)
Unity3D研究院之FBX模型的载入与人物行走动画的播放(十二)
围观68756次
编辑日期: 字体:
3D 世界中自定义模型的使用恐怕是重中之重,因为系统自身提供的模型肯定是无法满足GD对游戏的策划,所以为了让游戏更加绚丽,我们须要调用美术制作的精品模型与动画,本章MOMO将带领盆友们学习Unity3D中模型的载入与动画的播放,哇咔咔~~
由于MOMO手头上没有现成的模型,所以我将在Unity3D 官网中下载官方提供的游戏DEMO 中的模型来使用。另外官方提供了很多Unity3D 游戏DEMO,与详细的文档。可以帮助我们学习Unity.有兴趣的盆友可以去看看哈。
下载页面:
本章博文的目的是利用上一章介绍的游戏摇杆来控制人物模型的移动,与行走动画的播放。
如上图所示Create中的文件夹male中存放着模型动画与贴图等,这个应该是美术提供给我们的。然后将整个male用鼠标拖动到左侧3D世界中,通过移动,旋转,缩放将人物模型放置在一个理想的位置。右侧红框内设置模型动画的属性。
该模型默认动画名称为idle1
Animations
该模型动画的数量
Element 该模型的动画名称
Play Automatically 是否自动播放
Animation Physics 是否设置该模型物理碰撞
Animation Only if Visable 是否设置该模型仅自己显示
给该模型绑定一个脚本Controller.cs 用来接收摇杆返回的信息更新模型动画。
Controller.cs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
using UnityEngine;using System.Collections;&public class Controller : MonoBehaviour {& //人物的行走方向状态 public const int HERO_UP= 0; public const int HERO_RIGHT= 1; public const int HERO_DOWN= 2; public const int HERO_LEFT= 3;& //人物当前行走方向状态 public int state = 0;& //备份上一次人物当前行走方向状态 //这里暂时没有用到 public int backState = 0;& //游戏摇杆对象 public MPJoystick moveJoystick;&&& //这个方法只调用一次,在Start方法之前调用 public void Awake() {& }& //这个方法只调用一次,在Awake方法之后调用 void Start () {
state = HERO_DOWN; }& void Update () {& //获取摇杆控制的方向数据 上一章有详细介绍&&&&float touchKey_x =&&moveJoystick.position.x;&&&&float touchKey_y =&&moveJoystick.position.y;&&&&&&&if(touchKey_x == -1){&&&&&& setHeroState(HERO_LEFT);&&&&&}else if(touchKey_x == 1){&&&&&& setHeroState(HERO_RIGHT);&&&&&}&&&&&&&if(touchKey_y == -1){&&&&&&&&setHeroState(HERO_DOWN);&&&&&}else if(touchKey_y == 1){&&&& setHeroState(HERO_UP);&&&&}&&& if(touchKey_x == 0 && touchKey_y ==0){
//松开摇杆后播放默认动画,
//不穿参数为播放默认动画。
animation.Play(); }& }& public void setHeroState(int newState) {&
//根据当前人物方向 与上一次备份方向计算出模型旋转的角度
int rotateValue = (newState - state) * 90;
Vector3 transformValue = new Vector3();&
//播放行走动画
animation.Play("walk");&
//模型移动的位移的数值
switch(newState){
case HERO_UP:
transformValue = Vector3.forward * Time.deltaTime;
case HERO_DOWN:
transformValue = -Vector3.forward * Time.deltaTime;
case HERO_LEFT:
transformValue = Vector3.left * Time.deltaTime;&
case HERO_RIGHT:
transformValue = -Vector3.left * Time.deltaTime;
}&&&&&&&&&//模型旋转
transform.Rotate(Vector3.up, rotateValue);&
//模型移动
transform.Translate(transformValue, Space.World);&
backState = state;
state = newState;& }&}
上一章介绍了javaScript脚本使用游戏摇杆的方法,本章MOMO告诉大家使用C#脚本来使用游戏摇杆,上面我用 Controller.cs
C#脚本来接收系统提供的Joystick.js是肯定无法使用的,须要修改成.cs文件,我在国外的一个网站上看到了一个老外帮我们已经修改了,那么我将他修改后的代码贴出来方便大家学习,有兴趣的朋友可以研究研究。哇咔咔~
MPJoystick.cs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
using UnityEngine; &/**& * File: MPJoystick.cs& * Author: Chris Danielson of ()& * &// USED TO BE: Joystick.js taken from Penelope iPhone Tutorial&//&// Joystick creates a movable joystick (via GUITexture) that &// handles touch input, taps, and phases. Dead zones can control&// where the joystick input gets picked up and can be normalized.&//&// Optionally, you can enable the touchPad property from the editor&// to treat this Joystick as a TouchPad. A TouchPad allows the finger&// to touch down at any point and it tracks the movement relatively &// without moving the graphic&*/[RequireComponent(typeof(GUITexture))]&public class MPJoystick : MonoBehaviour&{&class Boundary {&public Vector2 min = Vector2.zero;&public Vector2 max = Vector2.zero;&}private static MPJoystick[] joysticks;
// A static collection of all joysticks&private static bool enumeratedJoysticks = false;&private static float tapTimeDelta = 0.3f;
// Time allowed between tapspublic bool touchPad;&public Vector2 position = Vector2.zero;&public Rect touchZone;&public Vector2 deadZone = Vector2.zero;
// Control when position is output&public bool normalize = false; // Normalize output after the dead-zone?&public int tapCount;
&private int lastFingerId = -1;
// Finger last used for this joystick&private float tapTimeWindow;
// How much time there is left for a tap to occur&private Vector2 fingerDownPos;&//private float fingerDownT&//private float firstDeltaTime = 0.5f;private GUITexture gui;&private Rect defaultRect;
// Default position / extents of the joystick graphic&private Boundary guiBoundary = new Boundary();
// Boundary for joystick graphic&private Vector2 guiTouchOffset;
// Offset to apply to touch input&private Vector2 guiCenter;
// Center of joystickvoid Start() {&gui = (GUITexture)GetComponent(typeof(GUITexture));defaultRect = gui.pixelInset;&defaultRect.x += transform.position.x * Screen.width;// + gui.pixelInset.x; // -&&Screen.width * 0.5;&&&&& defaultRect.y += transform.position.y * Screen.height;// - Screen.height * 0.5;transform.position = Vector3.zero;if (touchPad) {&// If a texture has been assigned, then use the rect ferom the gui as our touchZone&if ( gui.texture )&touchZone = defaultRect;&} else {&guiTouchOffset.x = defaultRect.width * 0.5f;&guiTouchOffset.y = defaultRect.height * 0.5f;// Cache the center of the GUI, since it doesn't change&guiCenter.x = defaultRect.x + guiTouchOffset.x;&guiCenter.y = defaultRect.y + guiTouchOffset.y;// Let's build the GUI boundary, so we can clamp joystick movement&guiBoundary.min.x = defaultRect.x - guiTouchOffset.x;&guiBoundary.max.x = defaultRect.x + guiTouchOffset.x;&guiBoundary.min.y = defaultRect.y - guiTouchOffset.y;&guiBoundary.max.y = defaultRect.y + guiTouchOffset.y;&}&}public Vector2 getGUICenter() {&return guiCenter;&}void Disable() {&gameObject.active = false;&//enumeratedJoysticks =&}private void ResetJoystick() {&gui.pixelInset = defaultRect;&lastFingerId = -1;&position = Vector2.zero;&fingerDownPos = Vector2.zero;&}private bool IsFingerDown() {&return (lastFingerId != -1);&}public void LatchedFinger(int fingerId) {&// If another joystick has latched this finger, then we must release it&if ( lastFingerId == fingerId )&ResetJoystick();&}void Update() {&if (!enumeratedJoysticks) {&// Collect all joysticks in the game, so we can relay finger latching messages&joysticks = (MPJoystick[])FindObjectsOfType(typeof(MPJoystick));&enumeratedJoysticks = true;&}int count = Input.touchCount;if ( tapTimeWindow & 0 )&tapTimeWindow -= Time.deltaTime;&else&tapCount = 0;if ( count == 0 )&ResetJoystick();&else&{&for(int i = 0; i & count; i++) {&Touch touch = Input.GetTouch(i);&Vector2 guiTouchPos = touch.position - guiTouchOffset;bool shouldLatchFinger = false;&if (touchPad) {&if (touchZone.Contains(touch.position))&shouldLatchFinger = true;&}&else if (gui.HitTest(touch.position)) {&shouldLatchFinger = true;&}// Latch the finger if this is a new touch&if (shouldLatchFinger && (lastFingerId == -1 ?? lastFingerId != touch.fingerId )) {if (touchPad) {&//gui.color.a = 0.15;&lastFingerId = touch.fingerId;&//fingerDownPos = touch.&//fingerDownTime = Time.&}lastFingerId = touch.fingerId;&// Accumulate taps if it is within the time window&if ( tapTimeWindow & 0 )&tapCount++;&else {&tapCount = 1;&tapTimeWindow = tapTimeDelta;&}// Tell other joysticks we've latched this finger&//for (&&j : Joystick in joysticks )&foreach (MPJoystick j in joysticks) {&if (j != this) &j.LatchedFinger( touch.fingerId );&}&}if ( lastFingerId == touch.fingerId ) {&// Override the tap count with what the iPhone SDK reports if it is greater&// This is a workaround, since the iPhone SDK does not currently track taps&// for multiple touches&if ( touch.tapCount & tapCount )&tapCount = touch.tapCount;if ( touchPad ) {&// For a touchpad, let's just set the position directly based on distance from initial touchdown&position.x = Mathf.Clamp( ( touch.position.x - fingerDownPos.x ) / ( touchZone.width / 2 ), -1, 1 );&position.y = Mathf.Clamp( ( touch.position.y - fingerDownPos.y ) / ( touchZone.height / 2 ), -1, 1 );&} else {&// Change the location of the joystick graphic to match where the touch is&Rect r = gui.pixelInset;&r.x =&&Mathf.Clamp( guiTouchPos.x, guiBoundary.min.x, guiBoundary.max.x );&r.y =&&Mathf.Clamp( guiTouchPos.y, guiBoundary.min.y, guiBoundary.max.y );&gui.pixelInset = r;&}if (touch.phase == TouchPhase.Ended ?? touch.phase == TouchPhase.Canceled)&ResetJoystick();&}&}&}if (!touchPad) {&// Get a value between -1 and 1 based on the joystick graphic location&position.x = ( gui.pixelInset.x + guiTouchOffset.x - guiCenter.x ) / guiTouchOffset.x;&position.y = ( gui.pixelInset.y + guiTouchOffset.y - guiCenter.y ) / guiTouchOffset.y;&}// Adjust for dead zone&var absoluteX = Mathf.Abs( position.x );&var absoluteY = Mathf.Abs( position.y );&if (absoluteX & deadZone.x) {&// Report the joystick as being at the center if it is within the dead zone&position.x = 0;&}&else if (normalize) {&// Rescale the output after taking the dead zone into account&position.x = Mathf.Sign( position.x ) * ( absoluteX - deadZone.x ) / ( 1 - deadZone.x );&}if (absoluteY & deadZone.y) {&// Report the joystick as being at the center if it is within the dead zone&position.y = 0;&}&else if (normalize) {&// Rescale the output after taking the dead zone into account&position.y = Mathf.Sign( position.y ) * ( absoluteY - deadZone.y ) / ( 1 - deadZone.y );&}}}
导出 build and run
看看在iPhone 上的效果,通过触摸游戏摇杆可以控制人物的上,下,左,右 ,左上,右上,左下,右下 8个方向的移动啦,不错吧,哇咔咔~~
最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,本来昨天就想发表这篇文章,结果晚上去打高尔夫球连挥N杆,打的回家后浑身酸痛,回家就睡觉啦~希望大家在学习的同时别忘了多运动。哇咔咔~~~ 附上Unity3D工程的下载地址,Xcode项目我就不上传了,须要的自己导出。
下载地址:
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!C4D制作花环旋转跳动的MG动画
分享一个很有趣的MG动效,制作软件CINEMA 4D ,教程来自doyoudo团队。MG动画是这两年比较流行的效果,早期的MG动画大多采用 After Effects 制作关键帧的方式来实现。但是K关键帧的方法有时并不适用于时间较为紧张的商业项目,所以现在很多的二维动画效果都是直接使用C4D制作的。强大运动图形的功能,能够让我们更加快速的实现动态效果;三维的空间立体感也填补了纯二维色块带来的单调感,使整个画面变得更加鲜活有趣。这次分享的教程还应用了视觉欺骗,让大家以为就是单一的小球,实际上却变换出很有趣的多样形态。同样的思路还可以制作很多的MG效果,来和doyoudo一起开脑洞吧!小贴士:在观看过程中可将清晰度切换至超清,画质更优。如出现不能观看的情况可关注我们的微信公众号&doyoudoteam&,回复关键字&花圈动效&获取观看链接同时还可第一时间获得doyoudo最新教程资讯&创意设计软件学习平台看幽默 超清 高效的视频教程,学习也会上瘾
打开微信“扫一扫”,将本文章分享到朋友圈
快给朋友分享吧!
16人已收藏
小U妹文章推荐
Ctrl+Enter
你的打赏就是我的动力!
悄悄说,听说打赏的人收入都比我高,不信你试试。
注: 打赏金额随意,完成后,请手动关闭本窗口。
Ctrl+Enter
您将要删除您的大作
C4D制作花环旋转跳动的MG动画
在她入驻到UI中国的日子里
总共吸引了2059位设计师的驻足流连
总共收获了10位设计师的由衷赞赏
总共获得了16位设计师的悉心珍藏
总共引起了2位设计师的深入讨论
依然要删除吗?ShaderLab(6)
Shader &Custom/RotateShader& { & & &&
& & & &Properties
& & & & & &_MainTex(&Main Tex&,2D)=&Write&{}
& & & & & &//给unity3d提供一个滑动条来控制旋转速度
& & & & & &_RotateSpeed(&Rotate Speed&,Range(0,10))=5
& & & &SubShader
& & & & &Tags{&Queue&=&Transparent& &RenderType&=&Transparent&}
& & & & &Blend SrcAlpha OneMinusSrcAlpha
& & & & &Pass
& & & & &{
& & & & & & CGPROGRAM
& & & & & & #pragma vertex vert
& & & & & & #pragma fragment frag
& & & & & & #include &UnityCG.cginc&
& & & & & & sampler2D _MainT
& & & & & & float _RotateS
& & & & & & struct v2f
& & & & & & {
& & & & & & & &float4 pos:POSITION;
& & & & & & & &float4 uv:TEXCOORD;
& & & & & & };
& & & & & & v2f vert(appdata_base v)
& & & & & & {
& & & & & & & &v2
& & & & & & & &o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
& & & & & & & &o.uv=v.
& & & & & & & &
& & & & & & }
& & & & & & half4 frag(v2f i):COLOR
& & & & & & { &//定义一个float2来存储顶点的UV的XY,减去0.5是因为uv旋转的起始是1,1为中心,XY都减去0.5是把中心点移到中心。
& & & & & & & &float2 uv=i.uv.xy -float2(0.5,0.5);
& & & & & & & // & & & &_Time & 是一个内置的float4时间,X是1/20,Y是1倍,Z是2倍,W是3倍 & & & & &&
& & & & & & & // & & & &旋转矩阵的公式是: COS() - &sin() , sin() + cos() & & 顺时针
& & & & & & & // & & & & & & & & & & & & & & & & & & & & & & COS() + &sin() , sin() - cos() & & 逆时针 & &&
& & & & & & & &uv = float2( & &uv.x*cos(_RotateSpeed * _Time.y) - uv.y*sin(_RotateSpeed*_Time.y),
& & & & & & & & & & & & & & & & & & & uv.x*sin(_RotateSpeed * _Time.y) + uv.y*cos(_RotateSpeed*_Time.y) );
& & & & & & & &//再加回来
& & & & & & & &uv += float2(0.5,0.5);
& & & & & & & &half4 c=tex2D(_MainTex,uv);
& & & & & & & &
& & & & & & }
& & & & & & ENDCG & & & &
& & & & &}& & & & & & & & &&
//旋转后发现,四个顶点周围不太正确,哪是因为UNITY3D默认采取了 重叠纹理寻址模式,需要再贴图里改为夹取纹理寻址模式,贴图的 wrap Mode改为clamp
//具体可参见这篇文章 & /jdmei520/archive//2857352.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:26141次
排名:千里之外
原创:44篇
评论:10条
(1)(1)(9)(11)(9)(2)(1)(15)(1)(1)

我要回帖

更多关于 unity 旋转动画效果 的文章

 

随机推荐