2013-04-19 17:10:45 iteye_20251 阅读数 211

一、创建Unity项目

       打开Unity游戏编辑器界面,在导航菜单栏中选择File --->  New Project菜单项,在弹出界面中选择Create new Project页面,将项目名命名为MobilityModel,然后再点击Create Project,完成项目的创建。

       然后点击保存(Ctrl+S)保存场景。

 

二、构建模型

       在Hierarchy视图中分别创建游戏对象Plane(面板)、Cube(立方体)、Sphere(球体)、Cylinder(圆柱体)、Capsule(胶囊体),然后鼠标拖动创建的游戏对象将他们摆放在合适的位置。

       接下来在游戏中添加一个光源,在Hierarchy视图中选择Create--->Directional light菜单项,光源是游戏中非常重要的一个属性,一定要在游戏场景中设置它,如果不设置光源对象,Game视图会非常暗,严重影响游戏的效果。

 

三、添加脚本

       在Project视图中点击Create--->JavaScript菜单项创建一个游戏脚本,将其命名为MobilityModelScript.js,在脚本上编写如下代码:

//模型移动速度
var TranslateSpeed = 10;
//模型旋转速度
var RotateSpeed = 1000;
//绘制UI界面
function OnGUI(){
	//设置GUI背景色
    GUI.backgroundColor = Color.red;
	if(GUI.Button(Rect(10,10,70,30),"向左旋转")){
		//向左旋转
		transform.Rotate(Vector3.up * Time.deltaTime * (-RotateSpeed));
	}
	if(GUI.Button(Rect(90,10,70,30),"向前移动")){
		//向前移动
		transform.Translate(Vector3.forward * Time.deltaTime * TranslateSpeed);
	}
	if(GUI.Button(Rect(170,10,70,30),"向右旋转")){
		//向右旋转
		transform.Rotate(Vector3.up * Time.deltaTime * RotateSpeed);
	}
	if(GUI.Button(Rect(90,50,70,30),"向后移动")){
		//向后移动
		transform.Translate(Vector3.forward * Time.deltaTime * (-TranslateSpeed));
	}
	if(GUI.Button(Rect(10,50,70,30),"向左移动")){
		//向左移动
		transform.Translate(Vector3.right * Time.deltaTime * (-TranslateSpeed));
	}
	if(GUI.Button(Rect(10,50,70,30),"向右移动")){
		//向右移动
		transform.Translate(Vector3.right * Time.deltaTime * TranslateSpeed);
	}
	
	//显示模型位置信息
	GUI.Label(Rect(250,10,200,30),"模型位置"+transform.position);
	//显示模型旋转信息
	GUI.Label(Rect(250,50,200,30),"模型旋转"+transform.rotation);
}

      上述代码中重要方法和属性如下:

      OnGUI()方法用来绘制GUI界面组件。

      GUI.Button():设置一个按钮,返回true时表示该按钮被按下。

      GUI.Label():设置一个文本框。

      transform:为当前绑定模型的变换对象。

      transform.Rotate():设置模型旋转。

      transform.Translate():设置模型平移。

      Time.deltaTime:该数值为一个只读属性,不可修改,表示完成最后一帧的事件,单位为秒。

      Vector3:标志一个模型移动或者旋转的方法。

      Rect:规定一个矩形区域,用于显示控件。

      将编写好的脚本对象,将其从Project视图拖拽到Hierarchy视图中的立方体(Cube)对象上,如果没有提示错误,表示脚本绑定成功,运行游戏后该游戏对象将执行该脚本中的内容。

 

       目前立方体对象与其他模型对象之间是不存在碰撞的,但是运行游戏后,可以控制立方体(Cube)直接穿越另一个模型对象。为了让模型对象之间具有物理的碰撞,需要给模型对象添加一个刚体(Rigidbody)属性,添加方式:首先在Hierarchy视图中选中立方体对象,在Uinty导航菜单栏中选择Component --> Physics 

-->Rigidbody菜单项即可。

 

四、测试运行

       点击运行按钮就能看到结果,可以点击显示的六个按钮对象,可以移动Cube(立方体)的位置和旋转。


 

2014-03-22 20:49:56 AWNUXCVBN 阅读数 6829


using UnityEngine;
using System.Collections;
using System.IO;

public class FrameAnimation : MonoBehaviour
{
    public Texture2D image;
    public int w;
    public int h;
    public float nextTime = 0.0f;
    public float rate = 0.3f;
    int i = 0;
    // Use this for initialization
    void Start()
    {
        w = Screen.width;
        h = Screen.height;
        image = new Texture2D(w,h);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButton(0)&& Time.time > nextTime)
        {
            nextTime = Time.time + rate;
            i++;
            StartCoroutine(SaveImage(i));
        }
    }

    IEnumerator SaveImage(int i)
    {
        yield return new WaitForEndOfFrame();  
        image.ReadPixels(new Rect(0, 0, w, h), 0, 0, true);
        image.Apply();
        byte[] bytes = image.EncodeToPNG();
        File.WriteAllBytes(Application.streamingAssetsPath + "/"+i + ".png", bytes);
        yield return null;
    }
}


2016-02-18 15:48:31 u010893023 阅读数 369

1,模型播放动画后产生缩放,
答:检查根节点的scale参数是否为1,不为1的时候会在播放动画时缩放
2,模型无法缩放
答:检查下图红框选项,optimize Gameobject 勾选会隐藏对应fbx的骨骼节点 导致缩放失效,
这里写图片描述

2019-02-18 18:29:50 qq_43667944 阅读数 110
               

在手游中换装成了越来越不可缺的一个功能,毫无疑问各式各样的时装为游戏增添了不同的色彩。

对于2D手游,或许是更换对应的序列帧,也或许是如同3D手游一般,更换模型动画。


对于游戏中的人物,一般分为头、上身、下身、武器四大部分就可以了。所以在游戏中,我们把这四部分单独做四个模型动画,然后动态拼接为一个整体,达到换装的效果。


然后根据动画制作人员的喜好 又有两种方式来拼接:

1、每个身体部位自带动画数据

2、每个身体部位不带动画数据,动画数据单独提取出来


我们这里介绍第二种。

对于我们这种每一个动作的单独一个动作数据的方式,要怎么拼合到一个动画数据。Unity官方文档有介绍 - 分割动画

http://game.ceeger.com/Manual/Splittinganimations.html




来看我们实际项目中的Project视图:


把每一个动作的动画数据都单独提取出来,然后汇总到warrior这一个文件中。


让我们来看看如何加载这些动画数据和各个部位到游戏中。


把四个部位的模型拖到Scene中,可以看到拼成了一个完整的人物


但是没有动作效果,因为这些只是模型骨头,但是没有动作数据,从右边的红框就看出来。

所以我们需要把动作数据加入到模型中。


点击右边的小圆点,在弹出的动画列表中选择动画,比如我选择的 run ,为四个部位的模型都选择run。再运行,这是就有了动作。我们的主角在跑动。


下面让我们通过代码来把动作和模型数据加载进来。


首先加载进来模型

using UnityEngine;using System.Collections;using System.Collections.Generic;public class LoadTest : MonoBehaviour { // Use this for initialization void Start () {        GameObject head = Instantiate(Resources.Load("anim/character/warrior/fashion/head_1")) as GameObject;        GameObject jack = Instantiate(Resources.Load("anim/character/warrior/fashion/jacket_1")) as GameObject;        GameObject pant = Instantiate(Resources.Load("anim/character/warrior/fashion/pants_1")) as GameObject;        GameObject weapon = Instantiate(Resources.Load("anim/character/warrior/fashion/warrior_10l")) as GameObject; }  // Update is called once per frame void Update () {  }}

然后加载进来动画数据:

using UnityEngine;using System.Collections;using System.Collections.Generic;public class LoadTest : MonoBehaviour { // Use this for initialization void Start () {        //加载模型;        GameObject head = Instantiate(Resources.Load("anim/character/warrior/fashion/head_1")) as GameObject;        GameObject jack = Instantiate(Resources.Load("anim/character/warrior/fashion/jacket_1")) as GameObject;        GameObject pant = Instantiate(Resources.Load("anim/character/warrior/fashion/pants_1")) as GameObject;        GameObject weapon = Instantiate(Resources.Load("anim/character/warrior/fashion/warrior_10l")) as GameObject;        //加载动作数据;        Animation mation = Resources.Load("anim/character/warrior/warrior", typeof(Animation)) as Animation;        //获取所有的动作;        List<string> animList = new List<string>();        foreach (AnimationState state in mation)        {            Debug.Log(state.name);            animList.Add(state.name);            //添加到四个部位;            head.animation.AddClip(mation.GetClip(state.name),state.name);            jack.animation.AddClip(mation.GetClip(state.name), state.name);            pant.animation.AddClip(mation.GetClip(state.name), state.name);            weapon.animation.AddClip(mation.GetClip(state.name), state.name);        }        head.animation.Play("run");        jack.animation.Play("run");        pant.animation.Play("run");        weapon.animation.Play("run"); }  // Update is called once per frame void Update () {  }}

并且播放run 这个动作。

来看看效果


我们的主角就这样跑起来了。


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2019-12-04 18:15:00 u013628121 阅读数 23

为模型动画片段上设置动画事件

反正麻烦,u3d有两种动画播放系统Animation\Animator,

没有办法预览
有的模型和动画是分开的,这时点击动画就没有办法播放,因为它找不到对应的模型.

只读动画片段 改 可写
大多数模型动画片段是只读的,这时候就没办法编辑动画.从而设置动画事件. 
所以需要:在Project窗口上选中动画片段->按CTRL+D ,
这样就会复制一个新的动画片段就在当前目录,这个新的动画片段才是可编辑的.

设置动画事件方法1, 缺点:动画片段要可写的
在Project窗口上选中动画片段->
点击Inspector窗口上的Open按钮->
在Animation窗口时间栏上选择合适的时间(事件触发点)处右键->
点击Add Animation Event 按钮

设置动画事件方法2  通过代码

       AnimationClip gunMove = animation.GetClip("left");//动画名
        AnimationEvent aevent = new AnimationEvent();
        aevent.functionName = "setInfo"; //方法名
        aevent.time = 1.05f;
        aevent.objectReferenceParameter=GameObject; // object类型参数 
        // aevent.intParameter = 9;   // int类型参数  
        gunMove.AddEvent(aevent);


        
设置动画事件方法3 通过代码,监听这个播放进度值,用回调写事件
Animation["anim"].normalizedTime 的值始终都是从0f到0.97f的,不会到1f.

Animator 

    public float AnimPlayNormalizedTime(string animName)
    {
        var infos = Animator.GetCurrentAnimatorStateInfo(0);
        var str = "Base Layer." + animName;

        if (infos.IsName(str) )
        {
            return infos.normalizedTime;
        }
        else
        {
            Debug.LogError("找不到 正在播放的动画");
        }
        return 0;
    }

 

没有更多推荐了,返回首页