Unity3D 游戏引擎之FBX模型的载入与人物行走动画的播放(十二)

Unity3D 游戏引擎之FBX模型的载入与人物行走动画的播放






雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/532


 

       3D 世界中自定义模型的使用恐怕是重中之重,因为系统自身提供的模型肯定是无法满足GD对游戏的策划,所以为了让游戏更加绚丽,我们须要调用美术制作的精品模型与动画,本章MOMO将带领盆友们学习Unity3D中模型的载入与动画的播放,哇咔咔~~



       由于MOMO手头上没有现成的模型,所以我将在Unity3D 官网中下载官方提供的游戏DEMO 中的模型来使用。另外官方提供了很多Unity3D 游戏DEMO,与详细的文档。可以帮助我们学习Unity.有兴趣的盆友可以去看看哈。

下载页面:http://unity3d.com/support/resources/  



本章博文的目的是利用上一章介绍的游戏摇杆来控制人物模型的移动,与行走动画的播放。








如上图所示Create中的文件夹male中存放着模型动画与贴图等,这个应该是美术提供给我们的。然后将整个male用鼠标拖动到左侧3D世界中,通过移动,旋转,缩放将人物模型放置在一个理想的位置。右侧红框内设置模型动画的属性。


Animation  

        idle1  该模型默认动画名称为idle1

Animations 

        size   该模型动画的数量

        Element 该模型的动画名称

Play Automatically 是否自动播放

Animation Physics 是否设置该模型物理碰撞

Animation Only if Visable 是否设置该模型仅自己显示



给该模型绑定一个脚本Controller.cs 用来接收摇杆返回的信息更新模型动画。

Controller.cs

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;break;	case HERO_DOWN:transformValue = -Vector3.forward * Time.deltaTime;break;	case HERO_LEFT:transformValue = Vector3.left * Time.deltaTime;break;	case HERO_RIGHT:transformValue = -Vector3.left * Time.deltaTime;break;				}//模型旋转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


using UnityEngine; /*** File: MPJoystick.cs* Author: Chris Danielson of (monkeyprism.com)* // 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 joysticksprivate static bool enumeratedJoysticks = false;private static float tapTimeDelta = 0.3f;	 // Time allowed between taps
public bool touchPad;public Vector2 position = Vector2.zero;public Rect touchZone;public Vector2 deadZone = Vector2.zero;	 // Control when position is outputpublic bool normalize = false; // Normalize output after the dead-zone?public int tapCount;	 private int lastFingerId = -1;	 // Finger last used for this joystickprivate float tapTimeWindow;	 // How much time there is left for a tap to occurprivate Vector2 fingerDownPos;//private float fingerDownTime;//private float firstDeltaTime = 0.5f;
private GUITexture gui;private Rect defaultRect;	 // Default position / extents of the joystick graphicprivate Boundary guiBoundary = new Boundary();	 // Boundary for joystick graphicprivate Vector2 guiTouchOffset;	 // Offset to apply to touch inputprivate Vector2 guiCenter;	 // Center of joystick
void 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 touchZoneif ( 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 changeguiCenter.x = defaultRect.x + guiTouchOffset.x;guiCenter.y = defaultRect.y + guiTouchOffset.y;
// Let's build the GUI boundary, so we can clamp joystick movementguiBoundary.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 = false;}
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 itif ( lastFingerId == fingerId )ResetJoystick();}
void Update() {if (!enumeratedJoysticks) {// Collect all joysticks in the game, so we can relay finger latching messagesjoysticks = (MPJoystick[])FindObjectsOfType(typeof(MPJoystick));enumeratedJoysticks = true;}
int count = Input.touchCount;
if ( tapTimeWindow > 0 )tapTimeWindow -= Time.deltaTime;elsetapCount = 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 touchif (shouldLatchFinger && (lastFingerId == -1 || lastFingerId != touch.fingerId )) {
if (touchPad) {//gui.color.a = 0.15;lastFingerId = touch.fingerId;//fingerDownPos = touch.position;//fingerDownTime = Time.time;}
lastFingerId = touch.fingerId;// Accumulate taps if it is within the time windowif ( 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 touchesif ( touch.tapCount > tapCount )tapCount = touch.tapCount;
if ( touchPad ) {// For a touchpad, let's just set the position directly based on distance from initial touchdownposition.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 isRect 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 locationposition.x = ( gui.pixelInset.x + guiTouchOffset.x - guiCenter.x ) / guiTouchOffset.x;position.y = ( gui.pixelInset.y + guiTouchOffset.y - guiCenter.y ) / guiTouchOffset.y;}
// Adjust for dead zonevar 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 zoneposition.x = 0;}else if (normalize) {// Rescale the output after taking the dead zone into accountposition.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 zoneposition.y = 0;}else if (normalize) {// Rescale the output after taking the dead zone into accountposition.y = Mathf.Sign( position.y ) * ( absoluteY - deadZone.y ) / ( 1 - deadZone.y );}
}
}



导出 build and run  看看在iPhone 上的效果,通过触摸游戏摇杆可以控制人物的上,下,左,右 ,左上,右上,左下,右下 8个方向的移动啦,不错吧,哇咔咔~~












最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,本来昨天就想发表这篇文章,结果晚上去打高尔夫球连挥N杆,打的回家后浑身酸痛,回家就睡觉啦~希望大家在学习的同时别忘了多运动。哇咔咔~~~ 附上Unity3D工程的下载地址,Xcode项目我就不上传了,须要的自己导出。


下载地址:http://www.xuanyusong.com/archives/532



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9918.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity - 官方2D动画(2D Animation Package)文档

本文由 祝你万事顺利 出品&#xff0c;转载请注明出处。 官方文档&#xff08;英文&#xff09;&#xff0c;2D Animation 在2019.3已经是正式发布的包了。此资源包是将Assets Store 中的Anima2D进行了整合&#xff0c;在老版本中可以使用Anima2D。 简介 2D Animation packag…

Unity 3D 动画系统(Mecanim)|| Unity 3D 人形角色动画(Avatar)

Unity 3D 动画系统&#xff08;Mecanim&#xff09; Mecanim 动画系统是 Unity 公司推出的全新动画系统&#xff0c;具有重定向、可融合等诸多新特性&#xff0c;可以帮助程序设计人员通过和美工人员的配合快速设计出角色动画&#xff0c;其主界面如下图所示。 Unity 公司计划…

Unity3D教程:fbx动画

Unity3D教程fbx动画。在官方提供的例子&#xff0c;可以找到主角的fbx文件。将此文件放到自己的Assets文件夹下&#xff0c;Unity3D中的Project面板会将其刷新出来&#xff0c;但是如下图所示&#xff0c;动作信息是没有经过分割的。一定要注意&#xff0c;不要选择Hierarchy面…

Unity3D类人动画humanoid animations

动画和Mecanim术语表 A Glossary of Animation and Mecanim terms Date:2013-05-24 11:01 Icon 图标 Term 术语 Description 描述Type of Concept 概念类型 Usage/Comments 用途/注释Animation Clip related terms 动画剪辑相关术语Animation Clip 动画剪辑Animation data that…

ChatGPT 工具论 我能用它做什么

​ 前言 bing版ChatGPT现在已经可以使用了。试用下来&#xff0c;相较于原版本ChatGPT&#xff0c;更加流畅&#xff0c;数据库也是最新的&#xff0c;在这里梳理下它能为我做什么。 1.搜索代码片段 我目前最想用过的功能就是这个&#xff0c;以前在CSDN上太难找到直接可以用…

给大家分享几个靠写代码赚钱的方法

微信搜 “涛哥聊Python” 点关注 设为 “星标”&#xff0c;每天下午 17:30&#xff0c;带你学Python&#xff01; 作者 mezod&#xff0c; 译者 josephchang10 来自&#xff1a;GithubDaily 如今&#xff0c;通过自己的代码去赚钱变得越来越简单&#xff0c;不过对很多人来说依…

宝塔webhook部署egg,并反向代理通过域名访问

文章目录 一、添加站点二、webhooks自动部署三、设置反向代理&#xff0c;通过域名访问 更多内容可参考我的博客 具体创建egg项目这里就不做过多叙述…请查看官网文档&#xff0c;本篇建立与已有egg仓库&#xff0c;宝塔的基础上。 一、添加站点 进入宝塔面板&#xff0c;点击…

安排,Nginx反向代理视频

来源&#xff1a; 来自网络&#xff0c;如侵权请告知博主删除&#xff0c;感谢????。 仅学习使用&#xff0c;请勿用于其他&#xff5e; 为什么要安排Nginx, Nginx 后端必会技能之一&#xff0c;虽然百度会告诉你怎么配&#xff0c;但是如果你自己学一遍的话&#xff0c;很…

Nginx关于视频播放反向代理

动机 这几天为了服务器上搭建的FileBrowser播放视频浏览了一堆资料,现在基本可以做个总结了. FileBrowser是一个开源的基于Web的文件管理器&#xff0c;它支持在Web浏览器中访问和管理本地和远程服务器上的文件。它提供了一个简单易用的界面来上传&#xff0c;下载&#xff0c;…

Nginx反向代理,让网页可以被别人访问

使用Nginx反向代理 1、下载Nginx   想要使用Nginx反向代理首先进入Nginx官网 http://nginx.org/2、在右侧选择download 3、选择自己操作系统的稳定版本 4、解压压缩包 5、进入html文件夹  把想要代理的网页替换文件夹中的index.html 6、回到nginx解压的主目录打开nginx.…

通过反向代理内网穿透访问视频监控

通过反向代理内网穿透访问视频监控 业务场景反向代理建立反向代理安装docker安装服务端安装客户端使用 穿透rtsp 业务场景 我们在客户的船上安装了监控设备&#xff0c;因为船只要横渡长江&#xff0c;长江南北属于不同的城市辖区&#xff0c;所以船在江中心时肯定会有4G基站变…

手把手教你搭建自己本地的ChatGLM

前言 如果能够本地自己搭建一个ChatGPT的话&#xff0c;训练一个属于自己知识库体系的人工智能AI对话系统&#xff0c;那么能够高效的处理应对所属领域的专业知识&#xff0c;甚至加入职业思维的意识&#xff0c;训练出能够结合行业领域知识高效产出的AI。这必定是十分高效的生…

网页在线沟通工具,网页即时聊天工具-ttkefu完全免费电话呼叫流程图

ttkefu的免费网页电话是怎么回事&#xff0c;应该怎么使用呢&#xff1f;都在哪里能加入免费电话 如图&#xff08;1&#xff09;在网站侧边加入免费电话 如图(2)在聊天咨询页面的网页电话 如图(3)点击打开网页电话&#xff0c;输入手机号或电话号。 &#xff08;图1&#xf…

ChatGPT和New Bing作为AI界新宠,两者有何异同

ChatGPT和New Bing是两个不同的实体&#xff0c;它们之间有一些区别也有一些相似之处。我先说说各自的特点&#xff0c;再汇总说说两者的异同点。 ChatGPT的特点&#xff1a; ChatGPT是一个基于神经网络的自然语言处理模型&#xff0c;能够自动生成自然语言响应。ChatGPT的模…

AI正在取代人工?ChatGPT这样说.....

随着ChatGPT的大火&#xff0c;对于AI机器人的讨论热度空前&#xff0c;它表现出的强大功能性&#xff0c;给当前多领域带来了更多发展可能性&#xff0c;但同时也为该模型带来的一系列技术伦理问题&#xff0c;争议也随之而来。 ChatGPT表现出的智慧与强大令人激动&#xff0…

【人工智能】你知道 ChatGPT 有什么新奇的使用方式吗?请来看看 Open AI 内部工程师都怎么使用 ChatGPT 的

现在,大家基本上把能想到的ChatGPT的使用方法都研究遍了——从写作、写代码,到翻译、英语润色,再到角色扮演等等。 说一个高级的,来看看OpenAI内部是如何使用ChatGPT的。 目录 说一个高级的,来

ChatGPT禁令影响A股吗

3月的最后一天&#xff0c;意大利政府数据保护局暂时禁止OpenAI的ChatGPT&#xff0c;并对其展开涉嫌违反隐私规则展开调查&#xff0c;这是风靡全球3个多月的ChatGPT首次遇到挫折。 据瑞银上月发布的一项研究显示&#xff0c;ChatGPT预计在1月份&#xff0c;即推出两个月后&a…

ChatGPT决定要挑战“考研”,你猜它会上岸吗?

2023年考研 Postgraduate Entrance Examination ChatGPT挑战考研 它能成功吗&#xff1f; 写在前面 在众多“考研人”中&#xff0c;有一个不同寻常的参与者——ChatGPT。这个人工智能模型在2022年12月惊艳亮相&#xff0c;成为了众人关注的焦点。虽然ChatGPT没有身份证&…

AIGC的隐私安全问题及隐私保护技术

作者:京东科技 杨博 ChatGPT 才出现两个月&#xff0c;就已经引起了学术界的关注。微软成为ChatGPT母公司OpenAI的合作伙伴&#xff0c;并确认投资百亿美元。同时&#xff0c;微软正计划将 OpenAI 的技术整合到其产品中&#xff0c;包括Bing搜索引擎和其他软件&#xff0c;以增…

ChatGPT数据安全隐患?本想提高效率,数据却遭泄露

一项新的研究发现&#xff0c;15%的员工经常在ChatGPT上上传公司数据&#xff0c;其中超过四分之一的数据被认为是敏感信息&#xff0c;这使公司在无形中面临安全漏洞的风险。 6月的研究报告《揭示真正的GenAI数据暴露风险》分析了超过10000名员工&#xff0c;主要研究员工如何…