当前位置:  编程技术>移动开发
本页文章导读:
    ▪(转)Unity3D 游戏发动机之FBX模型的载入与人物行走动画的播放        (转)Unity3D 游戏引擎之FBX模型的载入与人物行走动画的播放 原文地址:http://blog.csdn.net/xys289187120/article/details/6961080          3D 世界中自定义模型的使用恐怕是重中之重,因为系统自身提供的.........
    ▪ Ejabberd数据操作,怎么转义特殊字符        Ejabberd数据操作,如何转义特殊字符 如果从客户端接收的数据中含有特殊字符,如 ', ; , \ 等特殊字符,则用 ejabberd_odbc:escape(Name),方法进行转义,   如果 Name = "姓名'",   使用ejabberd_odbc:escape(Name)转.........
    ▪ 在Toast里边显示图片       在Toast里面显示图片 关于怎么在Toast里面显示图片,首先自定义一个toast,在自定义一个布局,这个布局你想让toast显示什么样的布局就定义什么样的,然后在自定的布局中放一个ImageView,在把.........

[1](转)Unity3D 游戏发动机之FBX模型的载入与人物行走动画的播放
    来源: 互联网  发布时间: 2014-02-18
(转)Unity3D 游戏引擎之FBX模型的载入与人物行走动画的播放

原文地址:http://blog.csdn.net/xys289187120/article/details/6961080


 

       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

view plain
  • 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:  
  •           
  •           
  •         //模型旋转  
  •         transform.Rotate(Vector3.up, rotateValue);  
  •           
  •             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


    view plain
  • 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 joysticks  
  •   
  • private 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 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 fingerDownTime;  
  •   
  • //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 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 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 = 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 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.position;  
  •   
  • //fingerDownTime = Time.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个方向的移动啦,不错吧,哇咔咔~~










        
    [2] Ejabberd数据操作,怎么转义特殊字符
        来源: 互联网  发布时间: 2014-02-18
    Ejabberd数据操作,如何转义特殊字符

    如果从客户端接收的数据中含有特殊字符,如 ', ; , \ 等特殊字符,则用 ejabberd_odbc:escape(Name),方法进行转义,

     

    如果 Name = "姓名'",

     

    使用ejabberd_odbc:escape(Name)转义过后,

     

    SName = ejabberd_odbc:escape(Name),

     

    SName的值为  "姓名\\'"

     

    这时候再将SName插入数据库就不会报错了.这样也可以防止SQL注入.


        
    [3] 在Toast里边显示图片
        来源: 互联网  发布时间: 2014-02-18
    在Toast里面显示图片

    关于怎么在Toast里面显示图片,首先自定义一个toast,在自定义一个布局,这个布局你想让toast显示什么样的布局就定义什么样的,然后在自定的布局中放一个ImageView,在把自己自定义的布局塞到Toast里面,然后在调用自己自定义的Toast就可以了。
    这个是我做的,虽然比较难看能说明问题就行。


     

    package com.rytong.toast;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button btn = (Button) findViewById(R.id.btn);
            btn.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    MyToast.myTosat(MainActivity.this, R.drawable.icon, "显示图片", Toast.LENGTH_LONG);
                }
            });
        }
    }
    
    
    
    //---------------------------
    package com.cn;
    import android.content.Context;
    import android.graphics.Color;
    import android.view.Gravity;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MyToast {
        public static void myTosat(Context context , int imageId ,String content , int duration){
            //new一个toast传入要显示的activity的上下文
            Toast toast = new Toast(context);
            //显示的时间
            toast.setDuration(duration);
            //显示的位置
            toast.setGravity(Gravity.BOTTOM,Gravity.BOTTOM,Gravity.BOTTOM);
            //重新给toast进行布局
            LinearLayout toastLayout = new LinearLayout(context);
            toastLayout.setOrientation(LinearLayout.HORIZONTAL);
            toastLayout.setGravity(Gravity.CENTER_VERTICAL);
           
            ImageView imageView = new ImageView(context);
            imageView.setImageResource(imageId);
            //把imageView添加到toastLayout的布局当中
            toastLayout.addView(imageView);
           
            TextView textView = new TextView(context);
            textView.setText(content);
    //        textView.setBackgroundColor(Color.GRAY);
            //把textView添加到toastLayout的布局当中
            toastLayout.addView(textView);
            toastLayout.setBackgroundColor(Color.GRAY);
            //把toastLayout添加到toast的布局当中
            toast.setView(toastLayout);
            toast.show();
        }
    }
    
    

     


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3