有谁知道Unityunity3d导入fbx动画的场景模型怎么设置碰撞

正在播放:将调整好的模型场景与unity场景合并
下载学院APP缓存视频离线看
购买本课程后即可享受以下服务:
24小时讲师答疑
所有课时永久观看
购买课程返学分
价格:120金币
购买本课程后,就可以记笔记了~~
开始记笔记……
记录时间点
我的笔记同学的笔记
购买本课程后,就可以提问题了~~
向老师提问……
记录时间点
我的问题同学的问题效果展示:
& &&& &&&& &&
开篇废话:
我现在所在的Team每周需要一个人给大家介绍一个知识点,或者新技术。这礼拜正好轮到我了,由于我工作才一年,面对那帮老鸟讲知识点感觉有点作死。所以我就准备选个新技术介绍一下。
由于我在大学里自学过一段时间Unity3D,所以我想介绍的技术就是它,但我现在做的是应用开发,不能做个小游戏去给大家演示。所以我想到比较简单,直观,而且有可能真正能用到的就是在Android应用中展示3D模型。比如在产品展示时直接把这个产品的3D模型展示出来而不是个图片,效果应该非常棒(OpenGL应该也可以做)。
思路定下以后就发现大学时学的Unity3D的内容基本忘光了,虽然偶尔有Unity3D的文章都会点开看看,但还是得重新学。记得当时学Unity3D的时候看过一个叫的博客。那时年轻,懵懂,找不到方向的我还给雨松大神发了一封邮件去请教大学应该怎么学习和做游戏相关的问题,结果人家没回,导致我更加失落于是接着学android去了。。。又扯远了。。。于是我又找到他的博客,把Unity3D基础部分的相关文章都看了一遍。
但是他博客里有介绍如何在Unity3D中调用Android,而我想做的是在Android中调用Unity3D,而且是把Unity3D嵌套在ANDROID的视图里面。最后费了九牛二虎之力才把这个Demo做出来。
准备工作:
下面是我总结的流程,目的是使本文思路更加清晰一些:
1.Android端代码可以在Eclipse中开发(AndroidStudio没有试,应该也可以)
2.Unity3D端代码要在Unity中开发
3.Android和Unity3D端,两边都需要加入一些代码从而可以使之关联交互。
4.将Android端代码编译成jar文件以插件形式放入到Unity端中
5.在Unity中将整个项目Build成apk文件,然后安装到手机或模拟器里运行
本文主要讲解1,2,3。对于4,5建议大家去看雨松MOMO的Unity博客的第17篇和第18篇。
UnityPlay:
在编写Android端和Unity3d端代码前,有必要先了解一下可以使两部分交互的类UnityPlay。
个人理解UnityPlay是个Unity提供给外部交互的一个接口类。
为什么是“个人理解”?这我不得不爆粗口了,TMD官网根本就没有相关的API和文档(如果大家有谁找到一定给我来一份,就当我骂自己了)。
在关联Android时,想拿到UnityPlay以及相关类的jar包可以从下面的地址找到:Unity安装路径\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夹下有一个classes.jar的jar文件,它就是我们想要的。
而在bin同目录下有一个src文件,点击到最后有3个类,分别是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前两个打开个后只有一行代码,说的是UnityPlayerActivity和UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity。而打开UnityPlayerNativeActivity中居然有代码,而且我估计这应该是UnityPlayerNativeActivity的源码。
由于关于UnityPlay的资料我只找到这么一个,所以我把UnityPlayerNativeActivity中的代码都贴出来,如果我注解有不对的地方希望大家指正。
* UnityPlayerActivity,UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity
* 而UnityPlayerNativeActivity继承自NativeActivity
* 在该类里定义了一些和ANDROID生命周期相同的回调方法,留给自定义的Activity子类重写。
public class UnityPlayerNativeActivity extends NativeActivity
//UnityPlayer的引用,并且我们不能改变这个引用变量的名字,它被native code所引用
protected UnityPlayer mUnityP
protected void onCreate (Bundle savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// 设置显示窗口参数
getWindow().takeSurface(null);
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
getWindow().setFormat(PixelFormat.RGB_565);
// 创建一个UnityPlayer对象,并赋值给全局的引用变量
mUnityPlayer = new UnityPlayer(this);
//为UnityPlayer设置一些参数
if (mUnityPlayer.getSettings ().getBoolean (&hide_status_bar&, true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
int glesMode = mUnityPlayer.getSettings().getInt(&gles_mode&, 1);
boolean trueColor8888 =
// UnityPlayer.init()方法需要在将view附加到layout之前调用。它将会调用native code
mUnityPlayer.init(glesMode, trueColor8888);
// 从UnityPlayer中获取到Unity的View视图
View playerView = mUnityPlayer.getView();
// 将Unity视图加载到根视图上
setContentView(playerView);
// 使Unity视图获取焦点
playerView.requestFocus();
protected void onDestroy ()
// 当Activity结束的时候调用UnityPlayer.quit()方法,它会卸载之前调用的native code
mUnityPlayer.quit();
super.onDestroy();
// 下面几个方法都是ANDROID相关回调方法,确保在ANDROID执行相应方法时UnityPlayer也需调用相应方法
protected void onPause()
super.onPause();
mUnityPlayer.pause();
protected void onResume()
super.onResume();
mUnityPlayer.resume();
public void onConfigurationChanged(Configuration newConfig)
super.onConfigurationChanged(newConfig);
mUnityPlayer.configurationChanged(newConfig);
public void onWindowFocusChanged(boolean hasFocus)
super.onWindowFocusChanged(hasFocus);
mUnityPlayer.windowFocusChanged(hasFocus);
public boolean dispatchKeyEvent(KeyEvent event)
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
return super.dispatchKeyEvent(event);
看完这个类后就知道了为什么在自定义的Activity中继承了UnityPlayerActivity等类以后,只要重写了onCreate并调用super.onCreate()方法后不需要任何其他的代码就会自动的显示出Unity3D的视图。因为初始化Unity视图的代码都在UnityPlayerNativeActivity父类中实现了。
ANDROID端代码:
在写ANDROID代码的时候,一定要导入Unity3D提供给我们的jar包,jar包的位置我在上面说了。引入jar包加入到buildpath中这些最基本的我就不多说了。
要想和Unity交互,我们就不能继承ANDROID提供给我们的Activity,我们需要继承刚才jar包中引入的Unity提供的Activity类,一共有这么3个:
UnityPlayerActivity,UnityPlayerProxyActivity,UnityPlayerNativeActivity。具体区别不知道,因为没有文档,没有API,没有源码(这里再次鄙视一下)。刚才我们看过UnityPlayerNativeActivity的代码(虽然很短,但我觉得这个就是源码),知道UnityPlayerActivity,UnityPlayerProxyActivity都是它的子类,而且最终父类为NativeActivity。所以我们继承Unity提供的最外层的子类是最好的选择,我这里选择的是UnityPlayerActivity,因为名字最简单,觉得该封装的都应该封装好了。
public class MainActivity extends UnityPlayerActivity {
private Button topB
private Button bottomB
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置test为我们的根布局
setContentView(R.layout.test);
// 通过刚才的源码分析,知道mUnityPlayer为一个全局的引用变量,而且已经在父类中设置好了,所以直接拿来用就可以了
View playerView = mUnityPlayer.getView();
// 将Unity的视图添加到我们为其准备的父容器中
LinearLayout ll = (LinearLayout) findViewById(R.id.unityViewLyaout);
ll.addView(playerView);
// 上面的button设置监听器
topButton = (Button) findViewById(R.id.topButton);
topButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//发送消息给Unity端,该函数第一个参数为接受消息的类对象,第二个该类对象用接受消息的方法,第三个参数为传递的消息
//所以下面的意思就为:调用Main Camera下面的Previous方法,传送的消息为空
UnityPlayer.UnitySendMessage(&Main Camera&,&Previous&,&&);
// 为下面的button设置监听器
bottomButton = (Button) findViewById(R.id.bottomBtn);
bottomButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//调用Main Camera下面的Next方法,传送的消息为空
UnityPlayer.UnitySendMessage(&Main Camera&,&Next&,&&);
最后看一下Android端的布局文件,布局很简单,上下各有一个button按钮,两个按钮中间是Unity的视图。
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical& &
android:id=&@+id/topButton&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_alignParentTop=&true&
android:text=&PREVIOUS& /&
&LinearLayout
android:id=&@+id/unityViewLyaout&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:layout_above=&@+id/bottomBtn&
android:layout_below=&@+id/topButton&
android:orientation=&horizontal& &
&/LinearLayout&
android:id=&@+id/bottomBtn&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_alignParentBottom=&true&
android:text=&NEXT& /&
&/RelativeLayout& Android端的代码就介绍完了,很简单。唯一的难点就是UnityPlayerActivity和UnityPlayer的使用,就这两个破玩意花了我好几天的时间,很简单的东西不知道为什么官方不给个文档或者API(也可能我太挫没找到。。。)
Unity3D端代码:
先看一下我的项目结构:
JavaScript存放的是脚本
Models存放的是我在Assert Store中下载的免费的一些模型文件
Plugins下是我的Android工程,具体做法参考网上教程(这里推荐雨松大神的第17篇)
Prefab我是调整模型后定义的预制体
在场景中,我只有一个摄像机,和一个直射光。将脚本绑定到摄像机上,然后将之前调整好的5个预设模型添加到脚本的相应对象中。
下面是脚本的代码,关于模型的旋转缩放是直接用了雨松MOMO的一篇文章中的代码,然后再加上了本例中的一些逻辑而组成的。
#pragma strict
//5个模型,从外部传入
var car : GameO
var helicopter : GameO
var suv : GameO
var plane : GameO
var tank : GameO
//模型数组下标
private var index :
//模型数组
private var models : GameObject[];
//当前模型对象
private var mCurrentGameObject : GameO
/******************************************/
/*分割线之下的变量用于触摸手势镜头控制旋转和缩放*/
/******************************************/
//缩放系数
var distance = 10.0;
//左右滑动移动速度
var xSpeed = 250.0;
var ySpeed = 120.0;
//缩放限制系数
var yMinLimit = -20;
var yMaxLimit = 80;
//摄像头的位置
var x = 0.0;
var y = 0.0;
//记录上一次手机触摸位置判断用户是在左放大还是缩小手势
private var oldPosition1 : Vector2;
private var oldPosition2 : Vector2;
function Start () {
//初始化模型数组
index = 0;
models = new GameObject[5];
models[0] =
models[1] =
models[2] =
models[3] =
models[4] =
//克隆一个初始模型对象
mCurrentGameObject = Instantiate(models[index], Vector3(0,0,0), Quaternion.Euler(-20,0,0));
//初始化镜头参数
var angles = transform.eulerA
x = angles.y;
y = angles.x;
function Update () {
//判断触摸数量为单点触摸
if(Input.touchCount == 1)
//触摸类型为移动触摸
if(Input.GetTouch(0).phase==TouchPhase.Moved)
//根据触摸点计算X与Y位置
x += Input.GetAxis(&Mouse X&) * xSpeed * 0.02;
y -= Input.GetAxis(&Mouse Y&) * ySpeed * 0.02;
//判断触摸数量为多点触摸
if(Input.touchCount & 1 )
//前两只手指触摸类型都为移动触摸
if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved)
//计算出当前两点触摸点的位置
var tempPosition1 = Input.GetTouch(0).
var tempPosition2 = Input.GetTouch(1).
//函数返回真为放大,返回假为缩小
if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2))
//放大系数超过3以后不允许继续放大
//这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
if(distance & 3)
distance -= 0.5;
//缩小洗漱返回18.5后不允许继续缩小
//这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
if(distance & 18.5)
distance += 0.5;
//备份上一次触摸点的位置,用于对比
oldPosition1=tempPosition1;
oldPosition2=tempPosition2;
//函数返回真为放大,返回假为缩小
function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean
//函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势
var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y));
var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y));
if(leng1 & leng2)
//放大手势
//缩小手势
//Update方法一旦调用结束以后进入这里算出重置摄像机的位置
function LateUpdate () {
//mCurrentGameObject为我们当前模型对象,缩放旋转的参照物
if (mCurrentGameObject.transform) {
//重置摄像机的位置
y = ClampAngle(y, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(y, x, 0);
var position = rotation * Vector3(0.0, 0.0, -distance) + mCurrentGameObject.transform.
transform.rotation =
transform.position =
static function ClampAngle (angle : float, min : float, max : float) {
if (angle & -360)
angle += 360;
if (angle & 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
// 当android中按下next,显示下一个模型
function Next () {
index = index+1;
if (index & models.Length-1) {
index = 0;
Debug.Log(&next&);
// 摧毁当前对象
Destroy(mCurrentGameObject);
// 建立新的模型对象
mCurrentGameObject = Instantiate(models[index]);
// 当android中按下previous,显示上一个模型
function Previous () {
index = index-1;
if (index & 0) {
index = models.Length-1;
Debug.Log(&previous&);
// 摧毁当前对象
Destroy(mCurrentGameObject);
// 建立新的模型对象
mCurrentGameObject = Instantiate(models[index]);
最后就是在Unity3D中将工程Build成APK文件,然后再手机或模拟器中运行(如果手机或模拟器连着Eclipse则可以打出log方便调试找错)。
最后附上代码Demo:
Unity端代码太大了,所以我就把Android端和Unity端代码上传到百度云了。而apk文件上传到csdn,如果只想看效果的可以下载来试试。
我在刚上大学的时候就梦想着毕业以后去做游戏,但是报志愿的时候选的是java相关,后来才知道java并不适合做游戏,后来自学c++,openGL,再后来又看Unity3D但全都没有坚持下来,而且大学时候天天和同学打wow,结果毕业发现其实游戏相关的东西根本等于一点也没学会,而且大连没有游戏开发的工作,虽然很想去北京试试,但是当时去北京实习太麻烦,而且不一定能找到,所以就在大连直接找了一个Android开发就这么把当初的梦想放弃了。但是我还是想明年去北京试试能不能找到游戏开发的工作,这中间一年我还是会主要学习Android和Java,剩余时间看看图形学和数学知识,不会像大学的时候看到什么热就学什么,因为现在懂得渐渐多了后发现编程基本都是通用的,所以还是先把一个东西学透学明白吧。有谁知道Unity导入的场景模型怎么设置碰撞_百度知道
有谁知道Unity导入的场景模型怎么设置碰撞
我有更好的答案
先要添加刚体的,再写碰撞代码就可以了
多边形刚体,LAYER可碰撞,加碰撞代码,这些东西书上有。
其他类似问题
为您推荐:
场景模型的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁在UNITY中导入3D模型 为什么从外面看有颜色 从里面看出去就透明了 而且也没碰撞-中国学网-中国IT综合门户网站
> 在UNITY中导入3D模型 为什么从外面看有颜色 从里面看出去就透明了 而且也没碰撞
在UNITY中导入3D模型 为什么从外面看有颜色 从里面看出去就透明了 而且也没碰撞
转载 编辑:李强
为了帮助网友解决“在UNITY中导入3D模型 为什么从外面”相关的问题,中国学网通过互联网对“在UNITY中导入3D模型 为什么从外面”相关的解决方案进行了整理,用户详细问题包括:<,具体解决方案如下:解决方案1: 因为Unity默认不支持双面材质,你的面会总是只能看到一面,另一面会直接穿透过去要么去下载或者自己写支持双面的材质,要么模型建模的时候就是立体的通过对数据库的索引,我们还为您准备了:问:问题如标题描述 附图 求解决方法答:因为Unity默认不支持双面材质,你的面会总是只能看到一面,另一面会直接穿透过去 要么去下载或者自己写支持双面的材质,要么模型建模的时候就是立体的===========================================问:问题如标题描述 附图 求解决方法答:max 或 maya 将模型导出.fbx或.obj文件(如果无动画,obj就行) 用鼠标拖拽文件至unity3d中即可===========================================问:问题如标题描述 附图 求解决方法答:.FBX 不带贴图的。 如果要贴图可以导入进来自己贴。===========================================问:问题如标题描述 附图 求解决方法答:Unity中只能使用fbx 或者obj格式 你要在max或者maya里面转换成这种格式 然后直接把转换好的资源 拖进unity的 assets中即可===========================================问:问题如标题描述 附图 求解决方法答:.max 文件目前无法直接导入unity3d,用3dmax打开.max文件后,将其导出为.FBX或者.3DS或者.OBJ文件,再导入unity3d即可===========================================问:unity如何导入3D模型答:在U3D编辑或导入其他格式===========================================问:前几个模型都是按照相同单位导入的,没问题。但是在导入一个模型整个模...答:在U3D编辑或导入其他格式===========================================问:前几个模型都是按照相同单位导入的,没问题。但是在导入一个模型整个模...答:不能直接导入。可以proe导出3d公用格式如3ds或iges,导入3dsmax,再导出unity3d模型===========================================问:首先: 我知道3d图形学习惯用y向上,也知道max里面z向上,也知道导出为f...答:在u3d中将他们的位置调好,然后在hierarchy中将武器拉向人物,使它成为人物的子物体,如果人物有手的子物体,那就拉向手,使其成为手的子物体。===========================================因为Unity默认不支持双面材质,你的面会总是只能看到一面,另一面会直接穿透过去 要么去下载或者自己写支持双面的材质,要么模型建模的时候就是立体的===========================================LZ应该是导入下载来的模型。模型自己发光应该是加了自发光的吧。要不就是材质没有联系到。把它们的材质全部改为默认材质试试吧。===========================================max 或 maya 将模型导出.fbx或.obj文件(如果无动画,obj就行) 用鼠标拖拽文件至unity3d中即可=========================================== 再从位图里找到跟3ds文件一起导出的那个木地板图片贴上就可以了 skp建模不掌握好技巧在3d里很难用的 多做做多想想把 呵呵 也可以直接导入3d时候付一个默认材质 就不...=========================================== 直接打开材质编辑器& 里面有一个吸管工具 点击需要吸的物体就可以了=========================================== 到顶视图!选中那个可以移动的物体(你说的看不见可以移动的)!然后按Z键! 放大试试!===========================================其实导入也很简单,可以在文件--导入里面导,或者直接把要导入的模型往场景里面拖(在顶视图操作较好),会提示你是打开&#47;合并&#47;参考。你选合并就行了===========================================可能是材质和渲染器不统一的原因·如果物体的材质是VRAY的 而你用的默认渲染器渲染的话,就会出现你上述的问题。建议提取材质,和检查渲染器的设置。 如果在合并之前渲...===========================================看下 视图显示方式。。还有下载导入的模型可能都有问题。重新制定个材质球卡看。。。按M建弹出材质编辑器+QQ===========================================编辑多边型里面有个分离命令.选中要分离的模型点一下.===========================================
本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助

我要回帖

更多关于 unity3d导入fbx动画 的文章

 

随机推荐