能不能给一个物体加两个unity box colliderr

用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
游戏编程博客欢迎大家关注。我对生活充满激情和热爱,现在从事游戏编程行业,希望做一款自己满意的游戏!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(217)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Unity3D脚本中文系列教程(五)',
blogAbstract:'
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}关于Local和Global
关于Local和Global
基本上而言,你在动了物体的方向后,它的XYZ(RGB)会跟着自己的轴心指向新方向。你只有点了Global按钮,它才会重新指向场景轴心方向。
关于脚本公共变量会在component界面出现
私有变量则不会(两种方法设置私有变量,一是在函数内部声明,另一个是在函数外部用private声明)
可以由其他脚本调用的变量则这样声明:static var ...
射出一个小盒子(注意,盒子prefab实现在工程中创建好,在脚本写完后,再往components里面拖):
var speed = 3.0;
var cratePrefab:T
function Update ()
//find out if a fire button is
pressed&&&
if(Input.GetButtonDown("Fire1"))
//create the
var crate = Instantiate(cratePrefab,
transform.position,Quaternion.identity);
//add force to the prefab
crate.rigidbody.AddForce(transform.forward * 2000);
关于Terrain,天空盒
在地形模块的最后一个工具,Terrain
Setting里,有一组选项是关于wind的,调整后可以改变物理风速对长草的影响。
可以通过Terrain -& Mass Place
Trees, 直接在场景中加大量的树木。
如果用第三方软件导入树木的模型,注意:
The pivot point of the tree mesh must be exactly at
the root of the tree, that is at the point where the tree should
meet the surface it is placed on.
有两种办法添加天空盒:
一,在camera (比如First Person
Controller这个prefab下的main camera)中,新增一个skybox组件(在components-&
rendering 下)。通过这种方法所加的天空盒只在游戏调用相应的摄像机时候才会渲染。
二,直接在Edit -& Redering Setting
中设置天空盒的材质。这样设置的天空盒无论在什么摄像机下都会渲染。
在Project目录中选好一个GUI资源文件,然后:
GameObject -& Create Other -& GUI Texture
同理,往Project相应目录里拖一个font文件(.ttf),然后:
GameObject -& Create Other -& GUI Text
可以通过调整transform position中的 z值来决定GUI的覆盖顺序。
GUI 脚本范例:
function Awake () {
guiText.text = “”+0;
创建好脚本,写完之后,将之attach到游戏目录中的GUIText文件上。
***创建3D主菜单***
GameObject -& Create Other -& Cube
可以同时打开Game Scene来实时的看Camera的调整状况
可以在Create Other中添加3D Text
如果想改3D Text的字体可以直接将工程目录的字体文件拖到3D Text 的属性中(font material
要另外拖到材质球选项中)
- 解决字体模糊的方法:第一,将字体文件的尺寸变大, 第二,将字符本身的尺寸(character size)变小
加好3D效果的菜单文字后通过 Component -& Physics -& Box Collider
为这个字加碰撞组件
&***在项目中添加新的Scene并获得Scene的order标记数字***
***3D菜单 脚本***
var isQuitBtn =
//检查某个按钮是否是退出APP的按钮
function onMouseEnter ()
renderer.material.color = Color.
function onMouseExit ()
renderer.material.color = Color.
function onMouseUp ()
if(isQuitBtn)
Application.Quit();
Application.LoadLevel(1);&
//这也就是前面说到的Level的Order Number了
导入3D模型资源
1. 先把Texture
Map放到Project目录中。
2.在同一目录中创建空的材质球(Material)
3.为材质球赋予纹理贴图,如果需要其他shader,则增加shader,然后将相应纹理贴图拖上去(例如Normal就拖到Bumped
Diffuse上)
4.可以将这个完成的材质球直接拖到场景中的3D模型身上。
5.或者,直接将材质球拖到创建好的prefab中的3D物体的材质模块中。
/unity/features/asset-importing
6.可以在Texture的组件中找到一个选项叫做Generate
Bumpmap,来利用Unity创建法线贴图
关于粒子特效
1. 如果要让特效随着物体转动(比如枪管喷射的火焰),则在粒子特效的Ellipsoid Particel
Emitter中,关掉“simulate in worldspace”选项。
2. 要调整粒子的拉伸方式,进入Particle Renderer模块,调整Stretch
Particles的模式(Billboard改为Stretched),然后将Velocity Scale调整之。
1. 进行动画编辑前,先把动画面板打开
2. 0:00,前面是时间,后面是帧数
automatically的选项关掉,就不会自动播放了
4.调用脚本触发动画(直接撞上去才能开,需要给door加一个tag):
function OnControllerColliderHit(hit
: ControllerColliderHit)
if(hit.gameObject.tag == "door")
hit.gameObject.animation.Play("door_open");
5.那么如何做一个感应门呢?这就要用到Raycasting了。
function Update()
var hit : RaycastH
//check if we're colliding
if(Physics.Raycast(transform.position, transform.forward, hit,
//这里的5距离你可以在函数声明前定义一个变量,然后替换,比如 var RaycastLength =
5;,然后在游戏的脚本组件中显示出来,并实时地改变看效果
//...with a door
if(hit.collider.gameObject.tag == "door")
//open the door
hit.collider.gameObject.animation.Play("door_open");
关于拾取物品
首先,让主角和拾取物产生碰撞
OnControllerConlliderHit(hit:
ControllerColliderHit)
if(hit.gameObject.tag == "crateGrenades")
print("BOX OF AMMO FOUND!")
其次,让可拾取物在碰撞后会消失,消失后给你物品栏中的相应物品增加数量:Destroy(hit.gameObject);
GRENADE_AMMO += 8;
3.然后在射击逻辑里(调用该物品的逻辑),做一个if判断,就行了&&&
if(Collide.GRENADE_AMMO & 0)
//create the prefab
var crate = Instantiate(cratePrefab,
transform.position,Quaternion.identity);
//add force to the prefab
crate.rigidbody.AddForce(transform.forward * 2000);
Collide.GRENADE_AMMO --;
print("YOU NOW HAVE" +&
Collide.GRENADE_AMMO&&
+ "GRENADES");
有一点要注意,因为GRENADE_AMMO是全局变量,在其他脚本可以调用,调用时前面直接加该脚本文件名即可
4. 最后,对于手榴弹而言,如果你不想让它从屏幕中间飞出来(因为脚本挂靠的是Main
Camera),可以另建一个低一点的Camera给shoot脚本挂上去
5. 在看到手榴弹爆炸特效的脚本这一节:通常的做法是把资源扔到场景中看效果,并且调整效果 —&
然后创建prefab,把调整好的GameObject扔进去 —& 删除场景中的instance —&
以后都从prefab调用这个物件
6. 怎么让爆炸效果和手榴弹prefab绑定呢:
var creationTime = Time.
var explotionPrefab : T&
//在手榴弹prefab内部强行创建一个空的prefab,稍后将爆炸特效的prefab拖进来落实
var lifeTime = 3;
function Awake()
creationTime = Time.
function Update ()
if(Time.time & (creationTime+lifeTime))
Destroy(gameObject);
Instantiate(explotionPrefab, transform.position,
Quaternion.identity);
1. 如何让AI转向我?非常简单,只有一行代码:var lookAtTarget :
function Update ()
transform.LookAt(lookAtTarget);
然后将该代码附着于你想让其转向的Game Object(这将在它的组件中创建一个变量Look At
Target)。然后再把Player这个Game Object,直接拖到变量Look At Target上。
然后不管它是什么,都会很恐怖的盯着你看了……
2.现在,让炮筒不要那么傻乎乎的:
var target :
var range = 10.0; //让炮筒对我有侦测范围
function Awake()
//让炮筒找到我,我的Tag是默认的
GameObject.FindWithTag("Player").
function Update()
if(targe && CanAttackTarget())&
//既能找到我,也能攻击我
var targetRotation =
Quaternion.LookRotation(target.position - transform.position,
Vector3.up);
transfomr.rotation =
Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime
//构造“是否启动攻击”的函数
function CanAttackTarget()
// Check if the target is close
if(Vector3.Distance(transform.postion, target)
print("Out of
Range");//太远啦
//确定该函数返回值是布尔变量。
&var hit : RaycastH
&//check if
there collision inbetween turret and target
&//看turret的视线里是不是有别的物体,还是能看见玩家
&if(Physics.Linecast(transform.position,
target.position, hit))
if(hit.collide.gameObject.tag !=
print("Item in the way:"
+hit.collide.gameObject.name);
print("Player
detected!");
return ***e;
如果发现RaycastHit侦测到了对象自己,就在属性的Layer里选“Ignor
关于Quaternion.Slerp&
static function Slerp (from :
Quaternion, to : Quaternion, t : float) :
Quaternion意思是:Spherically interpolates from towards
3.如何让物件的分部分播放动画?比如让榴弹炮的炮管伸缩?
在脚本的最前面:
先加两个变量
var leftFlame :
var rightFlame :
然后把枪管的火焰attch到这两个变量开放的值上(直接拖)
在脚本的最后面:
InvokeRepeating("FalconAnimate", 0,
//多长时间FalconAnimation这个函数会被执行
function FalconAnimate()
if (leftFlame &&
rightFlame)
if(leftFlame.renderer.enabled)
leftFlame.renderer.enabled =
rightFlame.renderer.enabled =
&&&&&&&&&&
leftFlame.renderer.enabled =
rightFlame.renderer.enabled =
print("Effects on Turret not
4.为了让榴弹炮真正的在看到我的时候才射击,需要设定Turret的状态机。
在最前面加一个变量
static var mode = "idle";
在invoke之前加两个函数
function Attack()
if(mode != "attack")
InvokeRepeating("FalconAnimate", 0, 0.05);
mode = "attack";
function Disengage()
if(mode != "idle")
CancelInvoke();
mode = "idle";
leftFlame.renderer.enabled =
rightFlame.renderer.enabled =
别忘了在Awake里面加上以下代码:
leftFlame.renderer.enabled =
rightFlame.renderer.enabled =
这样榴弹炮就不会游戏一开始就自动开打了。
最后,为了触发Attack和Disengage这两个函数,到前面用新的函数替换掉原来相应的“Print”函数。
创建血槽系统
1.首先一点,创建一个血槽UI,方法是,呃,创建10个分别代表不同血量的图片……
然后写一个脚本,写好后把他attach到player身上,然后在player的新组件里把相关的纹理关联上
var h00 : Texture2D;
var h10 : Texture2D;
var h20 : Texture2D;
var h30 : Texture2D;
var h40 : Texture2D;
var h50 : Texture2D;
var h60 : Texture2D;
var h70 : Texture2D;
var h80 : Texture2D;
static var HEALTH = 80;
function update()
&var g_Health =
gameObject.Find("g_Health");
if(HEALTH & 70)
g_Health.guiTexture.texture = h80;
else if(HEALTH & 60)
g_Health.guiTexture.texture = h70;
if(HEALTH & 50)
g_Health.guiTexture.texture = h60;
else if(HEALTH & 40)
g_Health.guiTexture.texture = h50;
&if(HEALTH & 30)
g_Health.guiTexture.texture = h40;
&else if(HEALTH & 20)
g_Health.guiTexture.texture = h30;
&if(HEALTH & 10)
g_Health.guiTexture.texture = h20;
&else if(HEALTH & 5)
g_Health.guiTexture.texture = h10;
&else if(HEALTH &= 0)
g_Health.guiTexture.texture = h00;
3. 测试代码:
InvokeReapting("subtract", 2, 0.5);
function subtract()
HEALTH -= 1;
print("health is now:" +HEALTH);
3. 如何决定炮管是否对我造成伤害?计算角度:
var forward = transform. //炮管的x方向
var targetDir = target.position - transform.
//炮管指向目标(玩家)的方向
var angle = Vector3.Angle(targetDir, forward); //计算夹角
4. 好了,造成伤害的话,要干掉你的血,接上面的代码:
if(angle & 10.0)
var damageTimer = 0.0; //人为设置伤害计时器,否则每帧都会造成伤害
function DoDamage()
if(damageTimer = 0.0)
damageTimer = Time. //伤害计时器初始值与当前时间等同
if((damageTimer+0.05) & Time.time)
Player.HEALTH -= 1;
print(Player.HEALTH);//测试代码
damageTimer = Time. //重置伤害计数器
5.最后,是如何触发结束画面的问题。还记得在Build
Setting里设定不同Scene的tag数字吗?
也就是加一行代码:
&else if(HEALTH &= 0)
&g_Health.guiTexture.texture = h00;
&Application.LoadLevel(0);//
如果死了,马上Load主菜单场景;
创建大规模城市
Engine中创建城市,然后导入Unity中。这个引擎既可以手动创建城市群,也可以自动生成不同风格的城市(细节由用户决定,甚至可以自动生成交通信号灯,马路上的车流...)。
2. 如何自动生成纹理贴图?他介绍了一个插件叫做Filter
Forge,他可以按照你的需求自动生成纹理,也可以制定纹理为法线贴图。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Ngui 五种点击事件实现方式及在3d场景中点透的情况
- 坚信移动技术可以改变我们的生活方式 - ITeye技术网站
博客分类:
gui作为界面插件之一中,无疑是最好用,使用最多的了从自学unity到现在界面一直使用它由于它的持续更新,我在此不得不说,确实很为开发者作想,为什么这么讲呢?大概在去年吧
当时用的那个版本已经不记得了,反正就是有个需求,要实现“无限循环”拖动,使用过以前ngui的人就知道当时是没有这个功能的,后来被自己弄出来没几天,就发现新版本中就自带了这样的东西,也就是如今ngui列子中的 Endless Scroll Views,当时,记得好像还心里暗骂了“坑爹”。好啦,可能稍微有些偏题了,现在进入正题:ngui点击事件我在此分为5种不同写法来总结一.OnClickOnClick作为传统的单击事件,其实真心好用,直接
[C#] 纯文本查看 复制代码
using UnityE
using System.C
public class onclicktest : MonoBehaviour {
public void OnClick()
Debug.Log("你通过OnClick点击了我!");
不管你是界面按钮 还是物体对象(需要加BoxCollider)都可用可是,太麻烦,不好管理。二.SendMessage1.SendMessage是属于Ngui老版本的一种事件实现方式了,在此就简单说下了&ignore_js_op style="word-wrap: break- color: rgb(105, 105, 105); font-family: 'microsoft yahei'; background-color: rgb(234, 234, 234);"&
Target:接收按钮消息的游戏对象。
Function Name:接收按钮消息的方法,拥有这个方法的脚本必须绑定在上面Target对象身上。
Trigger:触发的事件。
Include Children :是否让该对象的所有子对象也发送这个点击事件。
缺点:不直观,太多拖动操作,效率略低
三.通过UIButton属性面板附加事件
首先,在代码中写你要做的事情,
[C#] 纯文本查看 复制代码
using UnityE
using System.C
public class ClickTest : MonoBehaviour
//通过UIButton属性面板附加事件,该事件方法必须加public修饰
public void btn_Click()
Debug.Log("你通过UIButton属性面板附加事件点击了我!");
然后,拖动绑该代码定到场景任意对象上,
最后,选择你要点击的按钮,把刚才绑定代码的对象拖到,UIButton属性中的On Click中的Notify上,接着在Method中选择刚写的脚本里的方法就可以了
此方法个人感觉是SendMessage的升级版,比以前更加直观易懂,适用于刚接触Ngui的人学习使用。
缺点:效率略低,不可用于3d物体 如:Cube
四..Event Listener(推荐)
Event Listener选择要挂载的按钮,在Unity导航菜单栏中选择Component-&NGUI-&Internal -&Event Listener就可以了
代码写法有2种:
本帖隐藏的内容
[C#] 纯文本查看 复制代码
using UnityE
using System.C
public class EventListerrnTest : MonoBehaviour {
public Transform btn01;
public Transform btn02;
// Use this for initialization
void Start()
UIEventListener.Get(btn01.gameObject).onClick = (x) =&
Debug.Log("你通过UIEventListener第一种点击了我!");
UIEventListener.Get(btn02.gameObject).onClick = _btnC
//实现事件方法
private void _btnClicked(GameObject _go)
Debug.Log("你通过UIEventListener第二种点击了我!");
方便统一管理,效率不错。
五.EventDelegate(推荐)
代码更加简单
方便统一管理,可以单独创建一个事件管理脚本,直接操作管理
效率不错,不需要加载拖动其他额外的东西.
本帖隐藏的内容
[C#] 纯文本查看 复制代码
using UnityE
using System.C
public class EventUITest : MonoBehaviour {
public UIButton _
private void Awake()
//必须为 UIButton
EventDelegate.Add (this._btn.onClick, this.BtnClicked);
private void BtnClicked()
Debug.Log("你通过EventDelegate点击了我!");
代码写好后,拖动绑该代码定到场景任意对象上,同时赋对应button上去就可以了
好啦,ngui五种点击事件处理方式总结到此结束,至于怎么用,那么大家自己取舍咯
若有不足,欢迎指正
=====================分割线================
另附加: 解决ngui在3d场景中 点透的情况
大家做游戏可能遇到 点击地面玩家行走,可是点击界面按钮的时候,事件触发不了,或者同时执行了玩家点地行走事件,
这些都属于点透的情况。
目前据自己经验有2种解决方案
本帖隐藏的内容
1.在ngui事件代码中做一个判断如:
[C#] 纯文本查看 复制代码
viod OnClick()
if(UICamera.hoveredObject != null)
代表的意思是如果鼠标下面有NGUI物体就执行 2.通过射线来检测
[C#] 纯文本查看 复制代码
private RaycastHit _hit=new RaycastHit();.
if (UICamera.Raycast (Input.mousePosition, out _hit) == false)
代表的意思是判断在UI界面层操作.
希望对大家有用 同时有更好方法欢迎赐教
/thread-.html
浏览: 144596 次
来自: 北京
写道我在设置如何格式化的时候 总是保存不了
我在设置如何格式化的时候 总是保存不了 不知道楼主有遇到过这种 ...
大家不要总阅读。欢迎来评论一番。。
哟,阿哥也需要写代码?不是应该跟你皇阿玛出去郊游的吗

我要回帖

更多关于 box collider 的文章

 

随机推荐