2015-01-04 21:02:41 C1805217287 阅读数 868
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频,我们致力于打造业内unity3d培训学习第一品牌

       众所周知,自动寻路是所有游戏的一个难点,属于AI(人工智能)的范畴。一个游戏的AI的设计是否足够完美,可能决定了这个游戏的命运。然而自动寻路就是AI中的一个十分重要的分支,其算法异常复杂。然而unity3d中提供了一套非常成熟的组件来为我们解决这一难题。今天,我们就来一起欣赏一下Unity3d自带的自动寻路系统。


自动寻径

 
     1.创建一个简单的地形 
       
    2.添加进去一个角色
       
    3.创建几个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
        
    4.选中地形,在Navigation窗口中,勾选Navigation Static
      
    5.依次选中障碍物,在Navigation窗口中,勾选Navigation Static
    6.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了
         
     7.为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
         
     8.为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能
脚本:
          using UnityEngine;
          using System.Collections;

          public class Move : MonoBehaviour {

          private NavMeshAgent agent;

          void Start () {
          agent = GetComponent<NavMeshAgent>();
          }

          void Update () {
          RaycastHit hit;
          if (Input.GetMouseButtonDown(0))
          {
          Ray ray =Camera.main.ScreenPointToRay(Input.mousePosition);
          if (Physics.Raycast(ray, out hit))
          {
          agent.SetDestination(hit.point);
          }
}

     这样一个简单的自动寻径就完成了
       

动画效果

      运行时我们发现角色是平移移动的,看着很不舒服。我们需要为角色添加动画让角色动起来
脚本:
          using UnityEngine;
          using System.Collections;

          public class Move : MonoBehaviour {

          private Animator anim;

          void Start () {
          anim=GetComponent <Animator>();
          }

          void Update () {

          if (agent.remainingDistance == 0)
          {
           Trollidle();
           }
           else 
           {
           Trollwalk();
           }
           }
           void Trollidle() 
           {
           anim.SetFloat("idle", 1F);
           anim.SetFloat("walk", 0.0F);
            anim.SetFloat("run", 0F);
            }
           void Trollwalk() 
           {
           anim.SetFloat("idle",0F);
           anim.SetFloat("walk", 1.0F);
           anim.SetFloat("run", 0F);
           }
           }

宠物跟随

       public Transform target;
private NavMeshAgent agent;
void Start () {
agent = GetComponent<NavMeshAgent>();
}
void Update () {
if (target!= null) {
agent.destination=target.position;
}
}
    把脚本给宠物并为宠物添加NavMeshAgent, target为主角。这样宠物就可以跟随主角运动。
     


从高空跳下

    1、设置Navigation里面Bake的Drop Height的值
 
    2、勾选Navigation里面Object的OffMeshLink Generatic
    
    3、Bake

这样巨魔就可以从高出跳下来
    

选择性的行走

    1、把Navigation里面Bake的Drop Height的值设为0
   
    2、取消勾选Navigation里面Object的OffMeshLink Generatic
   
    3、Bake
    4、在Navigation里面Layers创建两个Layers(LayersUp  
      LayersDown)-->Bake
     
    5、选中主角,设置属性(NavMesh Walkable :Default )
                
 
 这样主角行走时就会不走红色区域
    
2015-02-05 08:34:06 book_longssl 阅读数 5225
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。


导入动画文件后,在工程(Porject)面板中选中,通过Inspector面板修改参数设置。

在项目视图中选中模型文件。如果想用旧版3.x的动画系统导入和编辑动画,请选择legacy选项。如果你有一个人性角色,比如,一个脑袋两条胳膊的两足动物,请选择Humanoid和‘Create from this model’,这样,一个完美匹配你角色骨骼关系的替身就可以被创建,或者你也可以选择其他预设好的替身。

如果你的角色不是人形物体,比如一个四足动物或者任何其它的你想编辑动画的物体-并且你希望新的动画系统Mecanim,请选择Generic选项,然后你必须在下拉菜单中为你的动画模型定义一个骨骼作为根节点。

Model选项卡

属性

Scale Factor 缩放系数。

Mesh Compression网格压缩.降低网格文件大小,但有可能导致变形。

Mesh Optimization 网格优化.优化三角形的排列顺序。

Generate Colliders产生碰撞体。生成网格碰撞体。

Swap UVs交换UV(通过改变纹理坐标,实现动态效果的纹理动画)当有光照贴图的物体的UV通道不正确时启用此选项。这将交换你的主UV通道与次UV通道。

Generate Lightmap产生光照贴图。

Normals 法线

Import 导入. 从文件导入法线。

Calculate 计算。根据平滑角度(Smoothing angle)计算法线。

None 不使用。如果网格既没有法线贴图,也不受实时光照影响,则可使用此选项。

Tangents 切线

Import 导入

Calculate计算切线和副法线。只有当法线为导入或计算时,此选项可用。

None禁用切线和副法线。如网格没有切线则不能使用法线贴图着色器。

Smoothing Angle 平滑角。设置边会被作为硬边处理的锋利程度。它还被用来切分法线贴图切线。

Split Tangents 分离切线。如果您的网格上的接缝破坏了法线贴图光照,启用此选项。这通常只适用于角色。

Import Materials 导入材质

Material Naming 材质命名。 此选项决定了Unity材质的命名方式.

Material Search 材质搜索。决定Unity如何根据材质命名选项中定义的名字查找已有的材质。

Rig选项卡

属性

Animation Type 动画类型

None 无

没有预制动画

Legacy 旧版

旧版系统动画

Generic 通用

通用Mecanim动画

Humanoid 人形

人形Mecanim动画系统

Avatar Definition 替身定义

在这里定义动画控制融合等。

Create from this model    从这个模型创建

替身物体将依据选择的模型创建

Copy from other Avatar    从其它替身拷贝

依据其它模型替身定义创建

Configure... 配置...

动画剪辑存储着所有可使用于角色动画或简单动画的动画数据。

2013-10-12 16:19:50 woailvmengmeng 阅读数 4342
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

众所周知,自动寻路是所有游戏的一个难点,属于AI(人工智能)的范畴。一个游戏的AI的设计是否足够完美,可能决定了这个游戏的命运。然而自动寻路就是AI中的一个十分重要的分支,其算法异常复杂。然而unity3d中提供了一套非常成熟的组件来为我们解决这一难题。今天,我们就来一起欣赏一下Unity3d自带的自动寻路系统。

        我们在学习一个陌生的知识时,免不了要记一些令人烦恼的概念,自动寻路也是一样的。但是记东西也是有技巧的,我认为我们应该先看到一点惊喜再学东西,这样兴趣有了,学东西就不那么抵触了。所以我现在先列举举一个简单的例子,记住,先不要思考为什么我要这样做,如果你是初次学习这个自动寻路的话最好这样,不然你会走很多弯路的。我们需要新建一个工程,将其起名为:NavMeshProject。然后我们可以制作场景了。
        像往常一样,先做一个地面,这里我用的是Cube。然后我将我们的朋友Robot也请来了,看这:



是不是很帅啊!我特意加了个灯光,给地面换了个柔和的颜色,看起来就不那么单调了。然后我们保存一下整个场景,该场景取名为:TestNavgation1。
下面我来烘焙场景,但是记住,先不要想为什么。Unity3d编辑器的菜单下:Window->Navigation,这是我们可以发现编辑器的某一部分出现了一个Navigation窗口,如:


请注意一下此图的右下角的一个Bake按钮。
在Hierarchy下选中Plane(就是那个地面),然后我们在Navigation面板中的Object选项卡下找到Navigation Static复选框,勾选它,然后点击Navigation面板右下角的Bake按钮:


此时我们可以发现Project面板下面多出了一个文件夹,且此文件夹出现了一个子文件NavMesh: 



并且Scene窗口中的地面上出现了一下变化: 



然后我们跟robot添加一个组件:NavMeshAgent。具体做法是 :  在Hierarchy面板下选中robot,然后在Unity3d菜单下:Component->Navigation->NavMeshAgent,你会发现robot身上出现了一个类似胶囊体碰撞器的绿色线框的包围体,调节一下盖NavMeshAgent组件中的一些参数:Height,BaseOffset等,如图: 



最后我们该编写脚本了。我还是新建一个文件夹:Scripts。然后编写两个脚本:
脚本一,专门设置导航网格代理的目的地的:

using UnityEngine;
using System.Collections;

public class NavMeshMove : MonoBehaviour {

    public Transform[] NavMeshTransforms;//导航网格的目的地组。

    private NavMeshAgent nma;//Robot的导航网格代理

void Start () {
        if(NavMeshTransforms == null)
        {
            return;
        }
    nma = gameObject.GetComponent<NavMeshAgent>();
            nma.SetDestination(NavMeshTransforms[0].position);//初始时刻设置的导航网格代理的目的地
}

void Update () {

        if(nma.remainingDistance == 0){
            //当导航网格代理到达了目的地时,更换目的地,且是随机的更换
            nma.SetDestination(NavMeshTransforms[Random.Range(0,NavMeshTransforms.Length)].position);
        }
   }
}

脚本二,是专门为导航网格代理编写的动画控制脚本:

using UnityEngine;
using System.Collections;

public class NavNeshAnimation : MonoBehaviour {

    public float***nAnimaitonSpeed = 4.0f;//定义最大的跑步速度,一般为导航网格代理的速度
    public float speedThreshold = 0.1f;//定义动画从idle***n过渡的临界速度

    private string loadAnimation = "load_Idle";//定义需要执行的协同函数名
    private NavMeshAgent nma;//定义导航网格代理

IEnumerator Start () {
    nma = gameObject.GetComponent<NavMeshAgent>();
        AnimationSetup();//简单的设定一下动画。

        while(Application.isPlaying) {
            yield return StartCoroutine(loadAnimation);//执行协同函数
    }
    }

    IEnumerator load_Idle() 
    {
        do{
            UpdateAnimationBlend();
            yield return null;
            
        }while(nma.remainingDistance == 0);

        loadAnimation = "load_Run";
        yield return null;
    }

    IEnumerator load_Run()
    {
        do
        {
            UpdateAnimationBlend();
            yield return null;

        } while (nma.remainingDistance != 0);

        loadAnimation = "load_Idle";
        yield return null;

    }

    void AnimationSetup() 
    {
        animation["idle"].layer = 1 ;
        animation["***n"].layer = 1;
        animation.SyncLayer(1);

        animation.CrossFade("idle", 0.1f, PlayMode.StopAll);
    }
    
    void UpdateAnimationBlend() 
    {
        Vector3 velocityXZ = new Vector3(nma.velocity.x,0.0f,nma.velocity.z);
        float speed = velocityXZ.magnitude;
        animation["***n"].speed = speed /***nAnimaitonSpeed;

        if (speed > speedThreshold)
        {
            animation.CrossFade("***n");
        }
        else {
            animation.CrossFade("idle");
        }
    
    }
}

我们将这两个脚本绑定到robot身上,然后我们在Hierarchy面板中新建一个空的GameObject,重命名为:NavMeshPoint,并且新建5个spere作为它的子对象被其管理,如下:




然后将这5个spere分开到Plane上的不同位置,如下: 



选中robot,然后在Inspector下的NavMeshMove脚本上设置NavMeshTransforms的个数为5,并且将那5个spere分别拖拽到相应的位置,如下: 



好了,我们可以运行一下工程,看一下效果,这里只截了部分图片: 









从图中我们可以看出,我们的robot在不断的跑步,每次跑到目标点之后停下来,然后转身朝向下一个目标点,如果工程没有停止,那么它周而复始的循环下去,这对于编写NPC的AI很有帮助。
是不是很神奇呢?有没有想要将这部分知识融会贯通的冲动?我把工程一起献上吧。这个星期我的连续几篇文章,会深入的介绍这一系列的知识。敬请期待,不过我建议一下读者实现最好了解一些这个组件,看看与我的理解有什么不同,我们一同探讨,共同切磋。

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