如何c 终止函数InvokeRepeating函数

今天无意间读到大神写的代码,看到了Invoke函数,于是产生兴趣。后来才明白自己要学习的东西还有很多。
下面讲用法。
Invoke是延时调用函数,在用Invoke函数之前需要引入命名空间using UnityEngine.E
1.Invoke("MethodName",2)
这个比较简单,写在c#脚本中,意为 两秒之后调用一次,MethodName方法。
2.InvokeRepeating("MethodName",1,2)
这个方法就是多次调用Invoke,即理解为一秒后,每隔两秒调用MethodName方法。
3.CancelInvoke("MethodName")
取消MethodName方法的调用。
直接上代码看更加直观。
1 using UnityE
2 using System.C
3 using UnityEngine.E
5 public class InvokeTest : MonoBehaviour {
public GameObject P
private Vector3 v3;
public int i = <span style="color: #;
// Use this for initialization
<span style="color: #
void Start () {
<span style="color: #
v3 = new Vector3(<span style="color: #, <span style="color: #, <span style="color: #);
<span style="color: #
Invoke("TestIns", <span style="color: #);
<span style="color: #
//InvokeRepeating("TestIns", 2, 1);      //调用InvokeRepeating时候解开
<span style="color: #
<span style="color: #
<span style="color: #
// Update is called once per frame
<span style="color: #
void Update () {
<span style="color: #
if (v3.x == <span style="color: #) CancelInvoke("TestIns");
<span style="color: #
<span style="color: #
<span style="color: #
void TestIns() {                      
<span style="color: #
//v3.x +=                    //调用InvokeRepeating时候解开
<span style="color: #
Instantiate(Prefabs,v3,Quaternion.identity);
<span style="color: #
<span style="color: #
<span style="color: # }
以上代码,分别是Invoke方法,InvokeRepeating方法,CancelInvoke方法的使用。
Invoke还有一个用法就是可以激活UnityEvent。
下面是例子。
1 using UnityE
2 using System.C
3 using UnityEngine.E
5 public class TestLoader : MonoBehaviour {
[SerializeField]
protected UnityEvent onLoad = new UnityEvent();
[SerializeField]
protected UnityEvent unLoad = new UnityEvent();
<span style="color: #
// Use this for initialization
<span style="color: #
void Start () {
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
// Update is called once per frame
<span style="color: #
void Update () {
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
[ContextMenu("Load")]
<span style="color: #
public void Load() {
<span style="color: #
onLoad.Invoke();
<span style="color: #
<span style="color: #
<span style="color: #
[ContextMenu("unLoad")]
<span style="color: #
public void UnLoad() {
<span style="color: #
unLoad.Invoke();
<span style="color: #
<span style="color: # }
这里有两个序列化的UnityEvent,可能看代码不是很直观,直接上图。
是不是感觉很眼熟。对就是,像我们经常看到的Button下边的OnClick其实就是这种东西。
我们为这个东西挂上我们自己的测试脚本。
但是这时候我们想要调用测试脚本的方法了,这时候就用到了Invoke。
这里会自动调用UnityEvent下的脚本的指定方法。
测试脚本的代码如下。
1 using UnityE
2 using System.C
4 public class onLoadScripts1 : MonoBehaviour {
public void systemLoadMessage() {
Debug.Log("=======WhiteTaken=======");
public void systemLoadMessage(int i) {
<span style="color: #
Debug.Log("=====WhiteTaken:" + i + "======");
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # using UnityE
<span style="color: # using System.C
<span style="color: #
<span style="color: # public class onLoadScripts2 : MonoBehaviour {
<span style="color: #
public void systemLoadLog() {
<span style="color: #
Debug.Log("--------WhiteTaken----------");
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # using UnityE
<span style="color: # using System.C
<span style="color: #
<span style="color: # public class unLoadScripts : MonoBehaviour {
<span style="color: #
public void systemUnLoad(string name) {
<span style="color: #
Debug.Log("===----+ "+name+"卸载:-----=====");
<span style="color: #
<span style="color: # }
运行以后我们可以看到打印结果。
Invoke的其他用法,还没怎么用到,欢迎大家对我提出意见。有错误我会直接修改。
今晚继续学习单例模式。&
阅读(...) 评论()unity3d iphone游戏开发优化 - 每天记录一点,进步一点 - ITeye博客
博客分类:
- 试试把gameobject 一个一个禁用,确定下什么最影响性能
- stats 里面有多少个 Draw calls & 三角形
- 合并网格物体
- 合并材质张数
- 不要用网格碰撞.
- Unity对带动作的模型渲染消耗比较大,如果是静态的不带动作文件的模型渲染不会出现效率问题,但是要确保只绘制屏幕内的东西
1. 尽量避免每帧处理
function Update() { DoSomeThing(); }
可改为每5帧处理一次:
function Update() { if(Time.frameCount % 5 == 0) { DoSomeThing(); } }
2. 定时重复处理用 InvokeRepeating 函数实现比如,启动0.5秒后每隔1秒执行一次 DoSomeThing 函数:
function Start() { InvokeRepeating("DoSomeThing", 0.5, 1.0); }
3. 优化 Update, FixedUpdate, LateUpdate 等每帧处理的函数函数里面的变量尽量在头部声明。比如:
function Update() { var pos: Vector3 = transform. }
private var pos: Vector3; function Update(){ pos = transform. }
4. 主动回收垃圾给某个 GameObject 绑上以下的代码:
function Update() { if(Time.frameCount % 50 == 0) { System.GC.Collect(); } }
5. 运行时尽量减少 Tris 和 Draw Calls预览的时候,可点开 Stats,查看图形渲染的开销情况。特别注意 Tris 和 Draw Calls 这两个参数。一般来说,要做到:Tris 保持在 7.5k 以下Draw Calls 保持在 20 以下
6. 压缩 Mesh导入 3D 模型之后,在不影响显示效果的前提下,最好打开 Mesh Compression。Off, Low, Medium, High 这几个选项,可酌情选取。
7. 避免大量使用 Unity 自带的 Sphere 等内建 MeshUnity 内建的 Mesh,多边形的数量比较大,如果物体不要求特别圆滑,可导入其他的简单3D模型代替。
8. 优化数学计算比如,如果可以避免使用浮点型(float),尽量使用整形(int),尽量少用复杂的数学函数比如 Sin 和 Cos 等等。
1、 ArrayList的对象在使用时应该注意以下事项使用 arraylen = myarray. for (i=0; i& i++) { }避免for (i=0; i&myarray. i++) { } 2、 少用临时变量使用var touch:Vector2; function Update(){ if (count==0) { touch=iPhone.GeTouch(0).} } 避免function Update(){ if (count==0) { var touch:Vector2=iPhone.GeTouch(0). } }3、 少用算数符号/,改为乘以相应小数使用 x * 0.5f 避免x/24、 动作和AI不需要每帧都执行if (GLO.count%3){ // execute the enemy aim at your player every 3 Update } if (GLO.count%5){ // execute player IA every 5 Update }5、 Mesh部分原文:- do not use several materials for one mesh. I got the problem with a little model that had 2 materials. It was taking 2 time more polys! When i removed one material, it was showing at half his the size. I don't know why. Usually each material = 1 draw call, so use texture atlas! 个人译文:-对于一个mesh不要使用多张materials。我遇到过这样的问题是一个小模型拥有2张materials导致了2倍甚至更多的时间!而当我减少一个material的时候,时间减少了一半。原文- Use polygon cruncher to lower your mesh polys but even if your mesh look a little square, you can compensate this by tweaking "smoothing angle" in the importer inspector. For a highly optimized mesh, change the smoothing angle to 80 or even 120 and you mesh will look more smooth even with just a few polygons.个人译文:使用多边形粉碎机降低你mesh的面熟,但是虽然你的mesh看起来像一个正方形。你可以通过调整在导入区的” smoothing angle”选项来进行补偿。对于一个高优化的mesh,调整平滑角度到80甚至120度,你的mesh将看起来很配合虽然只是一点点的数量(???)原文- try not to use any expensive arithmetic like sin() or cos(). instead fill an array with precalculated values with x=0 to 360) sin(x) and cos(x) and use the values of this table. Of course it is in the case of you don't need precision.个人译文不要尝试使用任何昂贵消耗的数学公式,例如sin() 或 cos(),用预定义好的0到360度的sin(x)和cos(x)的值组成链表来替代。当然了前提是你不需要太精确。原文- force integer when possible. If you have a counter or check the position on the screen, declare the variable as INT, they are faster.个人译文尽可能的使用整形。如果你有一个检测屏幕位置的变量或者一个计数器,定义成整形会更快。Unity3d的一些小窍门1、防止黑屏In script change iPhoneSettings.screenCanDarken to false. This basically does the same as://Objective-C call [UIApplication sharedApplication].idleTimerDisabled = YES;It prevents the auto lock on iPhone to kick-in.
tank2308635
浏览: 139486 次
来自: 北京
这个版本太老了,admob更新了。我后来尝试[url]http ...
为什么我做出来的ui无法用鼠标操作?滑块拖不动,里面的文字删不 ...
黑苹果系统或者虚拟机的苹果系统怎么安装这个呢?^_^
codeone 写道运行不了,提示BASE SDK MISSI ...
运行不了,提示BASE SDK MISSING1.Invoke(string methodName,float time)
在一定时间调用methodName函数
using UnityE
using System.C
public class example : MonoBehaviour {
void LaunchProjectile() {
Rigidbody instance =
Instantiate(projectile);
instance.velocity = Random.insideUnitSphere
public void Awake() {
Invoke("LaunchProjectile", 2);
2.InvokeRepeating(string methodName,float time,float repeatRate)
每隔一定时间调用一次methodName函数
在time秒调用methodName方法;简单说,根据时间调用指定方法名的方法
从第一次调用开始,每隔repeatRate时间调用一次.
using UnityE
using System.C
public class example : MonoBehaviour {
void LaunchProjectile() {
Rigidbody instance =
Instantiate(projectile);
instance.velocity = Random.insideUnitSphere
public void Awake() {
InvokeRepeating("LaunchProjectile", 2, 0.3F);
//2秒后,每0.3f调用一次
3.CanceInvoke("methodName")
取消所有名为methodName的调用.
阅读(...) 评论()关于CancelInvoke的问题【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:74,655贴子:
关于CancelInvoke的问题收藏
我在一个脚本里写了InvokeRepeating 函数
想在其他脚本里把他停止了
能实现么?求指导
达内unity3d培训全程&实战教学&,unity3d金牌讲师授课.免费unity3d课程试听中!到达内unity3d学院学习unity3d,只需4个月速成unity3d游戏工程师.
有人知道么0 0
托个引用到新脚本上
你可以在写了InvokeRepeating
的脚本写个 public 函数里面放 CancelInvoke () 然后再其他脚本调用这个函数 不就行了吗
登录百度帐号推荐应用下次自动登录
现在的位置:
& 综合 & 正文
Unity3D开发之常用笔记
1.动画倒放 animation.speed *= -1.0;
2.寻找场景中物体var door = GameObject.Find("door").
3.全局变量用法,A.js 里的 static var AAA 到 B.js 里调用方式为 A.AAA
4.function Awake() 创建一个物体时自动运行的程序
5.js 中可以使用 "" +
0 将数字转换为字符串
6.3d字体较为模糊是因为使用了anti-aliasing,可以创建大的字体物体,将字体属性中的 size 设为小一些来解决
7.InvokeRepeating(函数名, 开始执行函数的时间, 调用函数的间隔时间);和 Update() 差不多但可以间隔着时间执行
8.Quaternion.Slerp(起点,目标点,期间耗费时间)
9.解决轴心问题,用物体绑定到 Empty GameObject 之下
10.隐藏鼠标 Screen.showCursor =
11.FixedUpdate()以指定频率被调用。
可以在 Edit -& project settings -& Time -& Fixed Timestep 中设定该频率。
12.计算圆半径 wheel.tireGraphic.renderer.bounds.size.y / 2;
13.显示载入关卡的进度条
var levelToLoad = 1;
function LoadNewLevel () {
if (Application.CanStreamedLevelBeLoaded (levelToLoad)) {
Application.LoadLevel (levelToLoad);
如果想在播放器中显示下载进度,可以通过GetStreamProgressForLevel()函数来读取进
14.用灯光中的 cookie 选项可以模拟移动的云的阴影
15.模拟爆炸伤害
使用 Component-&Particle-&World Particle Collider 添加一个粒子碰撞物体
如果 Send Collision Message 被启用, 任何发生碰撞的粒子都会发送一个
OnParticleCollision()到粒子系统附加的物体和与粒子发生碰撞的物体上。
调用 OnDrawGizmosSelected () 或者 OnDrawGizmos() 函数
16.function Update () {
if (Input.GetButtonDown ("Jump")) {
if (renderer.material.mainTexture.isPlaying) {
renderer.material.mainTexture.Pause();
renderer.material.mainTexture.Play();
17.function Start () {
yield WaitForSeconds(3);
print("hello");
18.容器菜单里的选项随着导入工程而变化
19.把物体直接层级面板拖动到工程面板就是Prefab了
@script AddComponentMenu("Universol Conraller/Cube Controller") //把容器添加进菜单栏
@script RequireComponent(Llight)
在物体中加入某个容器
21.Camera.main可以得到相机
22.Collider 必须搭配 Rigidbody 来使用,就像 Rigidbody 必须搭配 GameObject 一样
23.RigidBody 中的 IsKinematic 勾选后就不受物理控制了,没有重力了,但加了碰撞的Rigidbody物体还是会接收碰撞,但只能该物体碰撞它物体,如果受到它物体的碰撞不会发生反应,但触发器能接收信号,一般 IsKinematic 物体在完全受用户控制而不受其他物体影响时使用
宜于勾选的物体
赛车、子弹、人物、地形等
不宜勾选的物体
可被撞倒的路边垃圾桶、足球等
RigidBody 中的 Continuous/Continuous Dynamic 可以让运动物体碰撞静止物体时产生触碰信号
RigidBody 中的 sleepVelocity 可以忽略最小的运动来停止
24.Reset() 替换,用于设置物体的默认值也可以用
25.几个物体只要一个激活了其他就不能被调用的情况可以用设置 Static 物体来处理
26.iphone的常亮:iPhoneSettings.screenCanDarken =
Good organization is important if you want your workflow to be smooth and hassle
Use instantiated Prefabs wherever possible.
Try organizing by function instead of type.
Use Empty GameObjects as containers.
28.音效来源Apple's own Garage Band, Logic Studio 8 and Soundtrack / Soundtrack Pro software
29.CollisionFlags 可判断出碰撞物体的方向
30.Camera 容器的 Depth 参数可以调整几个摄像机的层级关系
31.为什么这里要用 SendMessage();playerLink.GetComponent(ThirdPersonController).SendMessage("HidePlayer");
32.LOD(Level-of-detail 编辑器)
33.QualitySettings.currentLevel = QualityLevel.F
34.ctrl + shift + n 新建 Empty GameObject
35.BeginGroup + EndGroup 可以创建一个类似 window 的区域,同时进行移动操作
36.导入文件时勾选 Generate Colliders 选项会自动为物体加入 MeshCollider 碰撞体
37.如何查看场景是否已经完成预加载,显示进度条功能
function Start() {
var async : AsyncOperation = Application.LoadLevelAsync("Game");
Debug.log("Loading Complete");
function OnGUI() {
//显示进度条
GUI.Label(Rect(100,300,200,200),(Application.GetStreamProgressForLevel(1) * 100.ToString(), "%");;
//如果已经预加载完毕,则点击 Start 进入场景
if(GUI.Button(Rect(100,100,200,100), "Start")){
if(Application.CanStreamedLevelBeLoaded(1)) {
Application.LoadLevel("Game");
另外WWW.Progress 可以检测下载进度(0~1)
EditorUtility.DisplayProgressBar 可以显示进度条
38.Unity 下载 OGG 音乐
public class DAudio: MonoBehaviour
string url = "http://XXXXXXXXXXXXXXXXXXXXXXXX.ogg";
WWW myWWW;
IEnumerator WWWLoading()
myWWW = new WWW(url);
yield return myWWW;
ac = myWWW.audioC
void Start()
StartCoroutine(WWWLoading());
void OnGUI()
if (myWWW.isDone)
audio.clip =
39.Unity API 坏了,搜索 API 时看似搜到了结果,但一条结果都未显示
上网下载 覆盖原有的 index.js
40.各种常用数学函数
Mathf.CeilToInt: 根据小数取整,如果该数不是整数,就加一个正的小数让他变成整数
Mathf.FloorCeilToInt: 根据小数取整,如果该数不是整数,就减一个正的小数让他变成整数
Mathf.RoundToInt: 根据小数取整数,四舍六入,如果小数是 0.5,则根据当前整数位取偶数整数
41.判断是否下载完毕
使用 myWWW.isDone 或者 myWWW.progress == 1f
尤其注意判断条件要写在 OnGUI() 里,不能写在 Update() 里,否则判断结果会有误差
42.如何在多个脚本中控制每个 Start 函数调用的先后顺序
在一个主 Start() 函数中依次调用各个脚本的初始化函数
使用全局静态变量,当前一个脚本中的相应初始化函数模块初始化完毕后,改变全局静态变量值来通知下一个脚本开始初始化。
43.自定义函数继承 Transform 或 GameObject 的方法
严格的来说是不行的,一般只能使用将自定义类作为 Component 绑定到物体上的方法,该物体可以是新建的 GameObject 或者克隆出的物体皆可
44.用 VS2010 打开项目文件失败,如下提示:
Couldn't call method SyncVisualStudioProject because the class SyncVS couldn't be found.
UnityEditor.DockArea:OnGUI()
解决方法:在 Unity 中,改变项目中的该脚本的位置(拖至其他文件夹下或最顶层),不要放在文件夹里打开,此时即可用 VS 打开,然后如果再拖回先前的文件夹后,也依然能打开
45.GUI 图片按中心进行旋转或缩放
RotateAroundPivot(float angle, Vector2 pivotPoint)
ScaleAroundPivot(Vector2 scale, Vector2 pivotPoint)
46.if 语句尽量使用大括号,否则容易出现让人摸不着头脑的错误
Debug.Log("AAA");
Debug.Log("BBB");
print("CCC");
由于Debug最终不输出,结果就被编译成了
if(false) {
print("CCC");
47. 查看自身能否看着目标物体(目标物体是否在背后)
Vector3 dir = (target.position - transform.position).
float direction = Vector3.Dot(dir, transform.forward);
48.如何建立不受父亲物体影响的位置移动
Transform.TransformDirection(Vector3 direction)
Transform.Translate(Vector3 direction, Space.World)
49.通过脚本控制物体的几种方法
1) 通过 GameObject.Find("物体名字") 保存该物体,然后就可随意对其控制了
2) 脚本中设置 public transform 物体,脚本给其他物体后,在外部把相应物体拖入
3) 直接给该物体,脚本中直接使用 transform 来控制
50.参照某一点缩放整个 GUI 的方法
GUIUtility.ScaleAroundPivot (Vector2 scale, Vector2 pivotPoint);
51.截屏的方法
//截图生成的图片
//最终获取图像大小
tex = new Texture2D((int)texMax.z, (int)texMax.w, TextureFormat.RGB24, false);
//截取屏幕的区域
tex.ReadPixels(new Rect(texMax.x, texMax.y, texMax.z, texMax.w), 0, 0);
//接受大小修改
tex.Apply();
52.动态缩小图片的方式
GUI.DrawTexture(new Rect(shotPngX, camRect.y, shotPngWidth, camRect.height), tex, ScaleMode.StretchToFill, true);
53.计算匀速数字变化
height = Mathf.Lerp(height, 10f, flightSpeed * Time.deltaTime / (10f - height));
54.如何锁定轴向运动
Component && Physics && Configurable Joint55.在视图中按下 Ctrl + F,可以快速输入要查找的物体名字来定位物体56.如何显示局部 GUI 界面通过 GUI.Window() 作为窗口物体57.相机剔除,也就是选择相机所看到的层camera.cullingMask = 1 && LayerMask.NameToLayer("LayerName");或者camera.cullingMask = Mathf.Pow(2, LayerMask.NameToLayer("LayerName"))前一种效率更高,后一种让代码更易读想添加多个剔除的话可以用camera.cullingMask = 1 && LayerMask.NameToLayer("LayerName1");
camera.cullingMask += 1 && LayerMask.NameToLayer("LayerName2");…………58.鼠标经过按钮提示文字标签功能GUI.Button(newRect(10, 10, 100, 20), newGUIContent("Click me", "This is the tooltip"));GUI.Label(newRect(10, 40, 100, 40), GUI.tooltip); 59.焦点改变事件curFocus = GUI.SetNextControlName("name");
name = GUI.TextField(nameRect, name);GUI.GetNameOfFocusedControl();注:Button不能记录 Focus 事件,需要手动记录例如:if(GUI.Button(ApplyRect, "OK")){
curFocus = "OK";}
1.GUI 的插件:iGUI、UIToolKit
2.地形插件:TerrainToolkit
.FBX, .dae, .3DS, .dxf .obj
PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 matlab 终止函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信