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

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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!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

这里写图片描述
2017-06-13 10:48:22 yongh701 阅读数 1648

在《【Unity3D】3D模型的使用——FBX的使用与Animation设置》(点击打开链接)曾经说明了,在Unity3D中使用3D模型,本文将进一步地说明如何用这个3D模型配合《【Unity3D】自动寻路》(点击打开链接)做出游戏主角的移动效果,同时进一步地实现连击。

本文使用的是:http://download.csdn.net/detail/yongh701/9867149中一个英雄模型。

将制作出如下的效果:


点击左键可以自由行走,行走的时候,不会碰到障碍物,然后点击右键可以进行连击,最多可以达到三连击。

制作过程如下:

一、场景布置

1、导入了英雄模型之后,可以看到fighter char采用传统的Animation而并非新型的Animator来实现英雄的动画,我们需要对Animation的一些基本属性进行设置,比如Animation设置为Stand,也就是默认是播放Stand这个动画,之后Size设置为5,输入按回车之后,用Stand、run、punch1~3分别填充Element0~5,意思英雄包含这5个动作。


2、之后场景布置如下:


3、与《【Unity3D】自动寻路》(点击打开链接)同理,保存当前的场景为Hero,对于Cube、Plane这些障碍体设置Navigation Static,然后点击烘培Bake,让Unity3D完成自动寻路的计算。


之后对主角fighter char添加一个Nav Mesh Agent组件,同时设置其半径radius为2,高度Height为8,主要看到绿色的导航圆柱体,能够完全覆盖主角,避免出现穿墙、入墙等现象。


二、脚本编写

对于英雄赋予如下的脚本Hero.cs:

using UnityEngine;
using System.Collections;

public class Hero : MonoBehaviour
{

    public GameObject plane;//地板
    private NavMeshAgent navMeshAgent;//自动寻路,必须要的导航体
    private int attack_combo;//连击数
    private bool is_Move, is_Attack;//是否在移动、攻击的flag

    void Start()//初始化是一个站着的状态
    {
        navMeshAgent = gameObject.GetComponent<NavMeshAgent>();//初始化navMeshAgent  
        attack_combo = 0;//连击数为0
        is_Move = false;//不在移动
        is_Attack = false;//不在攻击
    }

    void Update()
    {

        if (is_Move && navMeshAgent.remainingDistance < 0.01)//如果在移动中,而且离终点的距离不多于0.01
        {
            is_Move = false;//则设置为不移动状态
        }

        if (Input.GetMouseButtonDown(0))//鼠标左键点下    
        {
            animation.Play("run");//开始你的移动
            Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);//住摄像机向鼠标位置发射射线   
            RaycastHit mHit;
            if (Physics.Raycast(mRay, out mHit))//射线检验   
            {
                if (mHit.collider.gameObject == plane)
                {
                    navMeshAgent.SetDestination(mHit.point);//mHit.point就是射线和plane的相交点,实为碰撞点   
                    is_Move = true;//设置为移动状态
                }
            }
        }

        if (Input.GetMouseButtonDown(1))//鼠标右键点下  
        {
            navMeshAgent.Stop();//停止移动
            is_Move = false;
            if (attack_combo < 3)//如果连击数没到达上限,则开始连击
            {
                attack_combo++;
            }
            animation.Play("punch" + attack_combo);//进行相应阶段的连击
        }

        /*判断是否正处于攻击状态中,主要是判断是否将连击动画播放完毕*/
        bool is_Attack = false;
        string[] attack_animation_name = { "punch1", "punch2", "punch3" };
        for (int i = 0; i < attack_animation_name.Length; i++)
        {
            if (animation.IsPlaying(attack_animation_name[i]))
            {
                is_Attack = true;
                break;
            }
        }
        //如果是则不用进行任何操作,让它继续将连击动画播放完毕,如果不是,也就是连击动画播放完毕。
        if (!is_Attack)
        {
            attack_combo = 0;//连击数清0
        }

        if (!is_Attack && !is_Move)
        {//如果现在不是在攻击或者移动,则播放站立动画
            animation.Play("Stand");
        }

    }

}
并且指明这里的public GameObject plane就是Plane,则大功告成:

这个程序的关键主要就是这个脚本,主要难点和重点就是:一个,解决自动寻路的状态判定问题,另一个,连击实现的问题。

1、解决自动寻路的状态,虽然判断对象是否到达终点很简单if (navMeshAgent.remainingDistance < 0.01){}甚至if (navMeshAgent.hasPath){}都行,但这个判断并执行,一定要放在鼠标点下左键,让主角寻路之前,反正update()里面的代码是不停被执行的。放在之后有个很严重的问题,在你鼠标点击左键之后,系统会认为主角已经开始跑,但是要跑的路径还未来得及生成,就开始判断是否还有路径没跑完,判断是否离终点有剩余距离,就认为由于路径没生成,就没有寻路路径和离终点没有距离了。所以这个判断一定要放在开始自动寻路之前,否则会直接播放Stand动画,出现主角站着飘B到重点的行为。

2、连击问题,我认为应该这样:用户点击右键,只需要增加连击数,之后再根据连击数播放动画就好,无须像其它人,在点击右键之后的处理动作写一大堆东西。之后,对于连击数的清零,主要还是需要判断 主角的攻击动作是否完成。判断是否处于攻击状态,只能判断它是否处于播放攻击状态了。

这里设置private bool is_Move, is_Attack;//是否在移动、攻击的flag,其主要的意图在最后,if (!is_Attack && !is_Move) //如果现在不是在攻击或者移动,则播放站立动画。如果没有这句,主角完成一系列的动画,不会自动的回复到初始的Stand动画里面的。

这里是Animation连击,也就是指明如何对Unity3D中带有传统动画系统的FBX模型实现连接,所以不能像采用新型动画系统Animator的FBX模型,用AnimatorStateInfo animatorInfo;在配合animatorInfo.normalizedTime > 某百分比,来实现动画是否完成的判断,只能用传统的IsPlaying来搞了。

我认为网上盛传的Animator已经取代Animation完全是扯谈,个人在网上转来一圈,发现收集到的3D模型素材都还是用Animation的。当然如果你是新做的模型,当然要求美工使用Animator,毕竟Animator的方法与类更多,可以更好进行控制。

万万没想到这不足70行代码,居然弄了我一天了,之前玩kof玩combo玩得high翻天,万万没想到实现起来的逻辑居然这么难理解!

2017-05-02 15:08:49 yanggenye 阅读数 5410
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 挂脚本前记得要把SteamVR_TrackedController也挂到手柄上
/// 所以当使用的时候挂了2个脚本一个是本脚本一个是SteamVR_TrackedController
/// </summary>
public class Show : MonoBehaviour {
    public bool isShowGun = false;      //设置枪初始显示状态
    public GameObject Gun;         //公开一个枪的模块用于拖拽
    public GameObject mod;          //公开一个手柄模型
    SteamVR_TrackedController steamVR;  //定义一个 SteamVR_TrackedController 对象
    void showGun()  //显示枪的BOOL函数
    {
        Gun.SetActive(true);//枪模型是真
        mod.SetActive(false);//手柄模型是假
    }
    void shouMod()//显示手柄的bool函数
    {
        Gun.SetActive(false);//枪模型是假的
        mod.SetActive(true);//手柄模型是真的
    }

    void Start () {

        Gun.SetActive(false);//设置枪的隐藏状态
        steamVR = GetComponent<SteamVR_TrackedController>();//给对象一个组件
        steamVR.MenuButtonClicked += OnMenuButtonClicked;//OnMenuButtonClicked将这个函数附加给控制组件
        //这个键代表圆盘上面的键
        if (isShowGun)//如果要显示枪
        {
            showGun();//调用函数
        }
        else//如果不显示枪
        {
            shouMod();//调用函数
        }
    }

    void Update () {

    }
   void OnMenuButtonClicked(object sender, ClickedEventArgs e)//定义一个函数附加给控制组件
    {
        if (isShowGun==false)//当状态为假的时候
        {
            shouMod();//调用函数
            isShowGun = true;//将状态定义成真
        }else if (isShowGun == true)//当状态为真时
        {
            showGun();//调用函数
            isShowGun = false;//将状态定义为假
        }
    }
}
2013-01-21 14:53:57 jeksonal 阅读数 16695

unity3D 用3DMax 做的模型时需要注意几点

1:方向问题
2:模型尺寸问题

3:模型所占资源大小问题

 

3DMax 做的东西导入到 Unity3D 中,在 Unity3D 引擎中 X 会被反向旋转 90 度();个人处理方式是建模时先将模型 X 轴旋转 90;再调节模型;

3DMax 做的东西导入到 Unity3D 中,由于 3DMax 默认的单位处理机制与 Unity3D 不一样,而导致显示过小的问题;所以,在制作模型前先调节好 3DMax 中的系统单位设置

具体操作:

 菜单栏: 选择 “自定义”  ,

再选择 “单位设置”-- >

 接着点选 “系统单位设置 ”  --->   将系统单位比例设置成:  ;再点击 “ 确定” 保存!

在模型的制作过程当中,为了使物体的坐标在物体的中心点,要记得冻结物体的坐标属性

当模型制作完成时,导出为 FBX 格式时还需注意:

在导出的 设置面板中 :

点击高级选项,然后出现:

确保 “ 场景单位转化为:”的设置为 "Meters"


模型导出后,模型资源可能很大,原因有以下几个:

1: 检测一下材质贴图的格式是否为:.png 的,不是请改过来 ;

2:看模型当中是否有过多的独立存在的物体,将不需要单独 存在给它合并在一块!


要是模型导入到Unity3D 中后,引擎运行变卡,就得看看模型的面是不是太多了!


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