记录在学习《Unity 3.x 游戏开发 经典教材》时遇到的各种问题与笔记

1. 初始不能降低Terrain的高度,需要到Terrain设置的第二个按钮中将Height从0调高

(注意:最右边齿轮按钮里的Terrain Height是整个地形的最大高度,左图是当前笔刷绘制的最大高度)

   

2. SendMessage() 可以直接调用物体中的一个函数,而不在乎函数属于哪个脚本

// ① 书中P151
currentDoor.SendMessage("DoorCheck");
//此处,SendMessage()函数检查在currentDoor变量所保存的物体的所有脚本中是否存在一个名为 DoorCheck()的函数,如果找到了,就调用该函数 // ② 官方示例
// Calls the function ApplyDamage with a value of 5
gameObject.SendMessage ("ApplyDamage", 5.0); // Every script attached to the game object
// that has an ApplyDamage function will be called.
function ApplyDamage (damage : float)
{
print (damage);
}

 

3. 碰撞检测

OnControllerColliderHit() 这个函数的脚本不能随便绑定,要绑定到有角色控制器的对象上,比如Player

CharacterController.OnControllerColliderHit 控制碰撞器碰撞

缺陷:

◇ 代码被放到玩家物体中,随着不断完善代码,整个脚本会变得越来越庞大,难以维护

◇ 使用拓展后的碰撞器来激活门状态的改变,这样玩家会突然撞到一面无形的墙,从而突然停下移动的脚步,这一点影响了游戏可玩性

4. Collidion  Trigger 碰撞 和 触发

要使用Trigger检测物体进入,则需要勾选Is Trigger选项。否则物体就会被挡在碰撞区外,无法进入。

碰撞检测触发器Trigger 有别于碰撞检测器 Collision,其可以不受物理效果影响,一些可穿透区域的碰撞检测,可以使用Trigger来进行碰撞检测。

Trigger例子:

// 进入碰撞区域,触发canThrow = true
void OnTriggerEnter(Collider col)
{
if (col.gameObject.tag == "Player")
{
CoconetThrower.canThrow = true;
}
} // 离开碰撞区域,触发canThrow = false
void OnTriggerExit(Collider col)
{
if (col.gameObject.tag == "Player")
{
CoconetThrower.canThrow = false;
}
}

跟 OnTriggerEnter() 函数不同,OnCollisionEnter() 函数处理的是原型碰撞器之间的普通碰撞,也就是说,没有角色控制器碰撞器和处于触发模式的碰撞器。

在这个函数中,参数theObject是一个Collision类的实例,这样的一个实例保存着关于速率、刚体、碰撞器、变换、游戏物体的信息,另外还有碰撞发生时的接触点。

Collision 例子:

5. AudioSource.PlayClipAtPoint()

这个命令生成一个带有音频源的临时物体,播放完音乐之后移除自己。

AudioSource.PlayClipAtPoint(testSound,transform.position);

  testSound 音频源, transform.position 播放的位置

6. Instantiate 实例化

    public Rigidbody coconutPrefab;  //发射的椰子预设
public float throwSpeed = 30f; //发射速度 void Update ()
{
if (Input.GetButtonDown("Fire1") )
{
Rigidbody newCoconut = Instantiate(coconutPrefab, transform.position, transform.rotation) as Rigidbody; //克隆椰子
//newCoconut.name = "coconut"; //重命名克隆物体
newCoconut.velocity = transform.forward * throwSpeed; //方向和throwSped相乘,从而给刚体物体一个速率 Physics.IgnoreCollision(transform.root.collider, newCoconut.collider, true); //防止椰子实例化的时候和角色发生碰撞
}
}

7. Destroy

Destory(需要被移除的物体或者组件,多长时间后执行此移除函数);

// 编写以下脚本,并直接绑定到“椰子”预设上,生成的“椰子”克隆体就会在3秒后自动被删除,以此来减小游戏的开销。
void Start ()
{
Destroy(gameObject, 3);
}

  

8. 数组越界问题

    public Vector3[] dalou_correct ;   //大楼正确的位置
public Vector3[] chuang_correct ; //窗户正确的位置
// 如果在这里定义成 public Vector3[] dalou_correct = new Vector3[14];
// 在下面调用chuang_correct[0] 就会报错超出数组界限
void Start ()
{
chuang_correct = new Vector3[14];
dalou_correct = new Vector3[15]; dalou_now = GameObject.Find("DALOU");
chuang_now = GameObject.Find("windows");
cameraVir.gameObject.SetActive(false); Debug.Log(chuang_now.transform.childCount); //先记录正确的位置
for (int i = 0; i < chuang_now.transform.childCount; i++)
{
chuang_correct[i] = chuang_now.transform.GetChild(i).transform.position;
} for (int j = 0; j < dalou_now.transform.childCount; j++)
{
dalou_correct[j] = dalou_now.transform.GetChild(j).transform.position;
}

 

9. 透明 问题

参考

10. NGUI如果用SetActive(false)隐藏面板,当它上面还有正在执行的协程时就会报错

可以用UIPanel.alpha=0来隐藏

11. start函数只会执行一次,如果一个Cube上有start函数,在另一个物体上控制Cube.SetActive(false),再Cube.SetActive(true)

此时Cube再次激活时,Start函数不会被执行

12. 数组本身是引用传递,但是数组元素可以是值传递,不要直接记录原来的Transform数组,用Transform记录position是保存不了值的,用Vector3数组去记录position就可以了

[Unity菜鸟] 笔记2 —— 问题篇的更多相关文章

  1. [unity菜鸟] 笔记1 —— 函数篇

    SendMessage() 调用其他物体中的指令,先在脚本中编写一个自定义的函数,然后使用SendMessage()命令来调用那个物体上的命令 //①将以下函数附给target对象 void Rena ...

  2. Nginx快速入门菜鸟笔记

    Nginx快速入门-菜鸟笔记   1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6. ...

  3. AngularJS in Action读书笔记6(实战篇)——bug hunting

    这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...

  4. C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型

    遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...

  5. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  6. Noah的学习笔记之Python篇:函数“可变长参数”

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  7. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  8. Sed&awk笔记之sed篇

    http://blog.csdn.net/a81895898/article/details/8482387 Sed是什么 <sed and awk>一书中(1.2 A Stream Ed ...

  9. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

随机推荐

  1. SVN之文件同步更新

    在SVN的实际使用上,我有这样的一个需求,同一份保存在SVN库的文件,要求取出在不同的地方,并且仍然要保持同步.根据这样的需求,可以具体分为以下两种情况,下面以库文件A,副本文件A1和副本文件A2,来 ...

  2. lex&yacc 9

    the "line 15: error: syntax error" cant stop, if i test the statement "i<=0" ...

  3. OD常用断点

    OD常用断点 很全很全 常用断点 拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWi ...

  4. 关于webview嵌入swf

    有的机子CPU不支持swf播放的,不知道你是不是中奖了.. webview 加载swf很简单:         if(versionDouble>=2.2){//版本低于2.2的系统无法播放sw ...

  5. Microsoft.DirectX.DirectSound学习(一)

    背景:为什么用到这个类库呢?公司要一个要播放音频文件(.wav)的功能,本来想着很ez的事,网上提供的jq插件.本地也有很多播放器,怎么用都行.可当我实现的时候发现大部分网上插件在火狐上不支持.wav ...

  6. C# Winform程序打包

    1.新建一个安装项目,起名“Setup3” 2.点击应用程序文件夹 3.在右侧右键点击添加文件 注意:是Debug文件夹下所有程序 接着在添加你的应用程序项目的时候,多添加一个msiexec.exe进 ...

  7. 利用Google GCM发送push通知到Android客户端

    // 这个可以需要在google账号中申请,勾选gcm服务选项 $apiKey = 'AIzaSyC6h3ysrn2HDCBqONTo2vKIVVuktIFoxxx'; $headers = arra ...

  8. [Linux]学习笔记(1)

    说到Linux就不得不提UNIX,因为Linux是从UNIX系统发展来的,两系统极为相似,可以在UNIX操作系统上使用的功能都可以在Linux上使用,只可能有少许的差异: UNIX系统中所有的东西都是 ...

  9. JavaScript 高级程序设计 02-变量、数据类型

    一.JavaScript变量 1.变量的定义 在定义变量时,统一使用关键字var,后跟变量名(即标识符,如果不知道什么是标识符,可以到这去查看),如下 var message; //定义一个变量 注意 ...

  10. DICOM开源库

    转载于 http://blog.csdn.net/jackmacro/article/details/5850142 Developers used to search for libraries , ...