2017-04-17 21:10:20 qq_21057881 阅读数 6164

入坑了一个VR虚拟现实的项目,其中大量用到建模,于是用起了SketchUp建模工具,但是不管怎么导出,是fbx格式或者是别的,一旦导入到unity3d中,会失真,比如绿色的草坪会变成白色等等问题

但是呢我在一些模型网下载下来的是skp格式,而我直接用SketchUp弄出来的skp文件直接就不能导入unity3d,百度了一会没有解决方法,于是自己瞎试,因为网上能下载的是skp格式而且能正确导入和显示,就证明肯定是能的

后来找到了方法

在另存为,我们直接选择Version 8另存为,然后就能正确导入unity3d并且不失真了,而选第一个Version2016的话是不行的,不解。。反正问题解决了是吧2333

导进去之后原本绿色的地方也是绿色了,没失真


2019-12-17 18:25:54 sodifferent 阅读数 68

作业内容

1、 图片识别与建模
2、 虚拟按键小游戏

图像识别与建模

采用的系统

macos, unity3d v2018.4.13f1

环境的配置

与windows上的配置不同,在Vuforia官网上没有安装到macos的unity上面的安装包。(windows系统的话直接下载第二个文件,解压后会有一个exe文件,在unity的项目目录下安装即可)
在这里插入图片描述
经过查找找到了安装Vuforia的方法,就是在安装unity的时候会提示是否安装Vuforia,如果之前安装的时候勾选了,就可以直接用了,如果没有安装,就需要重新安装一次,在安装的时候勾选它即可(由于安装时没有截图,所以这里就不发那个过程了)
安装成功后在asset点击右键可以看到Vuforia的相关信息
在这里插入图片描述
然后就可以按照老师课件给出的步骤一步步实现。这里给出大概的步骤。

  1. 将项目中的摄像头全部删除
  2. 添加AR Camera
  3. 在AR camera中点击open vuforia engine configuration
    在这里插入图片描述
  4. 在global中输入在Vuforia网站上之前创建的key
    在这里插入图片描述
  5. 导入database,与课件中的方法一样,先从网站中把自己创建的数据库下载下来,再import进项目即可。这里导入数据库之后同步即可,不需要再进行其他的设置。(其已经自动添加进去了)
    在这里插入图片描述
  6. 点击file->build setting(这一步可省略)
    在这里插入图片描述
    下载android(下载安装完成后如下)
    在这里插入图片描述
  7. 点击右键添加ImageTarget
  8. 在ImageTarget中设置database等信息
    在这里插入图片描述
  9. 调整摄像头角度与卡片的大小,使得摄像头能够看到卡片
    在这里插入图片描述
  10. 在ImageTarget下添加一个对象,这个对象就是会在识别到卡片时在相应位置显示出来
    在这里插入图片描述
运行效果

在这里插入图片描述

虚拟按键的使用

与课件中直接从Vuforia中拖入virtual button不一样,在2018的版本中其已经被添加到了ImageTarget里面去了。在ImageTarget中的advanced可以直接添加virtual button
在这里插入图片描述
添加后就会出现一个绿色的板
在这里插入图片描述
添加两个按钮,一个按钮控制其向左平移,另一个向右平移,通过设置name来区分不同的按钮
在这里插入图片描述
这里还需要在按钮下添加一个平面,这样才能看到这个按钮,方便点击。
在这里插入图片描述
然后编写脚本设置点击事件
在这里插入图片描述
最后运行效果如下:
在这里插入图片描述
在这里插入图片描述

项目地址

2019-12-25 18:55:13 qq_40135006 阅读数 11

Unity3d-简单AR游戏

一、图片识别与建模

Vufria模块的导入

首先是安装Vuforia 模块,2017版本后的可以直接使用Unity Hub安装,安装完成后可以直接在软件中使用。

1

然后在菜单目录的GameObject->Vuforia->AR Camera添加AR 摄像头,添加后软件会要求导入Vuforia相关的文件,选择import即可。

2

导入成功后,可以在下方的文件管理菜单看到Vuria相关的模块。

创建Vufria项目

导入模块成功后,需要将该项目设置为AR项目,点击在主菜单的File->Build Setting,打开构建设置。

在然后点击playing setting ,从而在右边弹出Playing setting窗口,在这里将XR Setting 项中的Vuforia Realit 勾上。

Vuforia证书添加

以上就将游戏项目设置为AR项目了,但是下面还要进行图像处理的一些设置才能使用。首先是vuforia证书的添加,点击刚刚创建的ARCamera进入其Inspector页面,打开该页面下的Open Vuforia configuration。

点击后进入VuforiaConfiguration的Inspector,这里点击Add License按钮,然后会弹出一个Vuforia的官方网站。

点击网站后,首先要求登录账号,这里还有账号的需要注册一个。登录完会是下面的证书管理页面,该页面有列出了该账号有效的证书,如果没有有效的证书就点击Get Development Key创建一个。

证书创建页面输入一个不同的名字确认就行,创建完成后在刚刚的证书管理页面点击创建好的证书,然后复制灰色框的内容。

接着回到AR Camera的Inspector页面,将证书内容粘贴到App License Key的输入框中,证书的添加就完成了。

添加图片数据库

证书添加完成后,AR Camera就可以进行图像识别了,但现在只能识别其内置的图片,接下来是添加自己的识别图片。首先同样在AR Camera页面,打开Databases属性,点击Add Database按钮,进入Vufria图片数据库识别网站。

打开后进入Target Manager页面,这里列出的是登录账号已经识别过的图像数据库,新建则点击 Add Database按钮。

在创建数据库页面输入数据库的名字,然后类型选择为设备(Device)。

创建后进入图片数据库页面,在该页面选择Add target添加对应的图片,填写好图片的类型、宽度以及名字,然后会弹出正在识别的进度条,等待上传成功。

上传成功后数据库会多出对应的图片,然后就可以下载对应的数据库了。在左边勾上数据库中要识别的图片,在右上方点击Download Database,弹出一个Download Databases 对话框,这里选项选择Unity Editor,然后点击下载按钮。

下载完成后,找到对应下载的文件,后缀名为.unitypackage,直接将其拖到unity3d 中,弹出导入窗口,点击导入按钮。

最后再次回到AR Camera的Inspector页面,点开Databases可以看到这时多出了一个刚刚创建数据库的选项,将其以及其后面出现的Active选项勾上,这样图片识别数据库的添加就完成了,对应的数据库中的图片就可以被识别了。

图像识别建模

数据库添加完,就可以进行图片识别以及建模了,在对象树空白处单击右键,选择Vuforia->Image,创建出一个Target Image。

单击ImageTarget进入Inspector页面,在Image Target Behaviour 中选择对应要识别的数据库以及图片。

然后是对对应的图片建模,给ImageTarget添加任意的3D子对象,然后就可以运行了,运行后可以看到,在图片上方有对应创建的3D文件。

虚拟按键小游戏

不知道做什么虚拟按键游戏,这里就直接使用了之前写过的巡航兵游戏,利用图片进行巡航兵游戏的建模,然后添加四个虚拟按键分别代表上下左右。

添加识别图片以及模型

在图片识别中,这里直接使用了Vufria自带的图片,新建一个ImageTarget,在Databases选择VuforiaMars_Images,Image Target选择Astronaut。

将原来游戏中的地图添加为ImageTarget的子对象。

添加虚拟按钮

点击ImageTarget进入Inspector页面,在Image Target Behaviour选项中打开Advanced选项,点击Add Virual Button按钮,添加虚拟按钮。

设置好虚拟按钮的名字大小以及位置,名字需要唯一。

虚拟按钮没有实体,需要为每个按钮添加实体以及文本,为每个虚拟按钮添加对应的3dObject以及3dtext文本。

添加后的效果如下。

游戏图片以及视频、代码地址。

在这里插入图片描述

视频网站:https://www.bilibili.com/video/av80631937/

或hw11.mov

代码地址:https://github.com/ouzj5/3dgame/tree/master/hw11

2016-08-17 10:28:58 vipzjh 阅读数 2636

首先需要用到一款软件Tiledmap网上都可以下载的到,主要用它来画图,然后导出为json格式。注意要把原图片和json在同一文件夹,生成json的时候不能再改变原图的文件夹位置了。
这里写图片描述

这里写图片描述

这里写图片描述

我生成的是24*24像素的图片。所以在unity的 project-里的 Resources的tiled.png图片也Multiple切成24*24。
这里写图片描述
这里写图片描述
那么图片材料和json准备完毕。
接下来就是接受json数据,然后根据接受的数据读取图片块的各个位置组成一张地图,原理就是这样的。
1,首先建立一个tiledmap.cs类来接受json数据,也就是解析json


using UnityEngine;
using System.Collections.Generic;
public class LayersItem
{   
    public List <int > data { get; set; }
    public int height { get; set; }
    public string name { get; set; }
    public int opacity { get; set; }
    public string type { get; set; }
    public bool visible { get; set; }
    public int width { get; set; }
    public int x { get; set; }
    public int y { get; set; }
   }
public class Properties
{
}
public class TilesetsItem
{
    public int firstgid { get; set; }
    public string image { get; set; }
    public int imageheight { get; set; }
    public int imagewidth { get; set; }
    public int margin { get; set; }
    public string name { get; set; }
    public Properties properties { get; set; }
    public int spacing { get; set; }
    public int tileheight { get; set; }
    public int tilewidth { get; set; }

}
public class tiledmap
{ 
    public int height { get; set; }
    public List <LayersItem > layers { get; set; }
    public string orientation { get; set; }
    public Properties properties { get; set; }
    public string renderorder { get; set; }
    public int tileheight { get; set; }
    public List <TilesetsItem > tilesets { get; set; }
    public int tilewidth { get; set; }
    public int version { get; set; }
    public int width { get; set; }
    }

这个自己写的话太累,要对应的。http://sandbox.runjs.cn/show/nhuozgst
网上网站很多,直接生成c#类,可以直接使用。不过有些生成会有问题,像
public Properties properties { get; set; }这个就重复生成,你需要删除一个。
visible这个应该是bool类型的,生成的时候好像是string类型的,要出错,手动改回来
2,然后建个空的gaeobject挂一个GMmanager脚本,用来管理和生成地图。

using LitJson;
public class GMmanager : MonoBehaviour {
    public GameObject objparent;
    void Start () {
    CreateMap ();
      }

那么主要代码就在 CreateMap这个函数里面了。别忘了把LitJson.dll加进来并引用下。
3,CreateMap函数如下


Sprite[] temsprites = Resources.LoadAll<Sprite> ("tiled");
 UnityEngine.TextAsset text = Resources.Load ("myJson")as TextAsset;
        string tmp = text.text;
        //JsonData jsonData3 = JsonMapper.ToObject(tmp);
        tiledmap map = JsonMapper.ToObject<tiledmap>(tmp);
        int tw = map.tilewidth;//图块大小24像素,下面一样
        int th = map.tileheight;
        int sw = map.width;
        int sh = map.height;//这个我记得是25块,这样25*24=600,因为我想做的是800*600的,那800可以无限//扩大
    //Debug.Log (map.layers[0].data.Count);
        int x = 0,y=0;
        for(int i=0;i<map.layers[0].data.Count;i++){
            int imageID = map.layers [0].data [i];
            if (imageID != 0) {
                imageID -= 1;
                GameObject go = new GameObject (imageID.ToString (), typeof(RectTransform));
go.transform.SetParent (objparent.transform, false);
 Image image = go.AddComponent<Image> ();
image.rectTransform.pivot = Vector2.zero;
                image.rectTransform.sizeDelta = new UnityEngine.Vector2 (tw,th);
image.sprite = temsprites [imageID];
image.transform.localPosition = new Vector2 (x * tw, (sh - y - 1) * th);
          }
            x++;
            if(x>=sw){ //图片换行
                x = 0;
                y++;

            }
         }

思路是这样的。先把图块都加载进来,放到temsprites组里,不过都在内存中,还没办法显示出来。
然后通过 tiledmap map = JsonMapper.ToObject(tmp);所有的数据都在map这个对象里面了。在是通过一个循环for(int i=0;i<map.layers[0].data.Count;i++)
把图片都挂载到GameObject go的image组建里,确切的说应该是image组建的sprite变量里。也就是image.sprite。
注意layers[0],因为用tiledmap生成的图层只有一层,然后它生成的layers是个数组,所以我直接用0了。如果有多个图层的话用for或者foreach都可以。

go.transform.SetParent (objparent.transform, false);这个是设置一个父对象,好控制你整张图的位置
申明一个public GameObject objparent;我是在canvas下建的Panel(改名为Image)下的Panel(改名为map),把map拖到objparent,所以map为父对象了。Panel
效果图如下。
这里写图片描述

2014-12-14 12:57:50 chy_xfn 阅读数 2271

       之前做游戏时一直想实现这种效果,但从网上搜的资料都说是要写shader的,由于看不懂脚本,也就没去研究怎么写,后来发现材质中自带的着色器有这个功能;如下图,在材质中选择shader的Toon/Basic Outline,它的属性有个main color(整体颜色),Outline color(轮廓颜色),就是这个Outline color,可以改变物体的轮廓色,开始我琢磨想如何直接在脚本改变这个Outline color,但发现只能在shader里改,呃。。。,还是另想它法吧。


后来就想不能改属性,那可以把整个脚本换了啊,因为自带的shader脚本还有个Toon/Basic脚本,(如下图)这个脚本下是没有Outline color属性的,那么在游戏中就可以先给材质赋予Toon/Basic脚本,当敌人被选中时就通过脚本将材质的shader的改为Toon/Basic Outline,具体代码类似这样:

初始化时用这个:gameObject.renderer.material.shader=Shader.Find("Toon/Basic")(只是在面板设置可能会出错,需在脚本初始化)

选中时用这个gameObject.renderer.material.shader=Shader.Find("Toon/Basic Outline");(注意:gameObject表示具体的对象)

这种方法只是有点取巧的,如果换成其他的shader脚本,不一定有这Outline color属性,反正能用则用呗。


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