Unity3D 在Update中不要过多地修改Transform 信息
前文说到碰撞检测时候,不要在Update内部尝试移动GameObject 来检查碰撞检测,这样是徒劳无功。但是 说到
因为你移动的过程中其实并没有将实际的移动位置更新到物理引擎,只是做了个缓存而已,
只有在调用FixedUpdate的内部函数(物理引擎处理)时,才会将最新的位置设置到物理引擎上,甚至是渲染引擎也使用最新的位置。
其实是有问题的,因为我发现每次移动都会导致 碰撞器不断更新
下面是测试代码:
int TEST = ; // Returns true if you were able to move, false if you collided.
// 人物不断尝试往'下'走到 Y+amount
// 如果 中途碰撞到物体 则 人物站在 物体上 并return false
// 否则返回true,代表人物已成功移动到yVel 的位置
bool TryMoveY(float amount)
{
//optimize var sign = Mathf.Sign(amount);
var increment = 0.001f;
var progress = 0f; //var DEBUG = 0;
TEST = ;
while (true)
{
//DEBUG++;
++TEST;
var rest = Mathf.Abs(amount) - Mathf.Abs(progress);
if (rest <= )
break;
increment = Mathf.Min(increment, rest); Y += increment * sign;
progress += increment * sign;
if (Colliding())
{
Y -= increment * sign;
//print(DEBUG);
return false;
} }
//print(TEST);
TEST = ; //print(DEBUG);
return true; //var increment = amount > 0 ? 0.01f : -0.01f;
//var progress = 0f; //while(Mathf.Abs(progress) < Mathf.Abs(amount))
//{
// // progress 远远 小于 amount - increment
// // 步伐依然为 increment = 0.01
// if (Mathf.Abs(progress) < Mathf.Abs(amount) - Mathf.Abs(increment))
// {
// NOTHING
// }
// else // 缩小步伐(最后一步了)
// {
// increment = amount - progress;
// } // Y += increment;
// progress += increment; // if (Colliding())
// {
// Y -= increment;
// return false;
// }
//} //return true; } private void OnTriggerEnter2D(Collider2D collision)
{
print("ENTER: " + collision + " " + name + " " + TEST); } private void OnTriggerExit2D(Collider2D collision)
{
print("EXIT: " + collision + " " + name + " " + TEST);
}
这里顺便测试了到底 在Update中修改Transform(.Position)而更新 BoxCollider 是否会激发OnTriggerEnter2D、OnTriggerExit2D。如果 此两个函数输出时 TEST 的值不为0,则是在Update中会导致物理引擎的更新。这里输出的结果为0,所以我的猜测是对的。物理引擎并不是和脚本逻辑并行的(不是多线程)
但是更新了Transform 而立即导致物理碰撞器的更新,而不是暂时将Transform做缓存,等到物理引擎更新时才读取最新的Transform来更新碰撞器,为什么Unity3D这样做呢?
实际原因我当然是不得而知了,但是我猜测吧,应该是 物理引擎提供了一些基本的函数给脚本逻辑使用,例如Physics.Raycast / RaycastHit2D Linecast(Vector2 start, Vector2 end);等,如果没有及时更新 BoxCollider2D的信息,有可能会导致使用碰撞检测等API时会出现BUG。
Unity3D 在Update中不要过多地修改Transform 信息的更多相关文章
- svn修改log信息
在linux下安装了SVN服务器来做版本控制. 有天提交文件忘记了填写SVN提交日志,于是在项目中使用右键,show log,找到我提交的无日志的那条记录,点击右健,选择了“Edit log mess ...
- Properties集合_修改配置信息
集合中的数据来自于一个文件 注意:必须要保证该文件中的数据是键值对. 需要使用到读取流 使用load()方法读取已有文件中的数据,存储到Properties集合中 public class Pro ...
- C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
C# json反序列化 对象中嵌套数组 (转载) 看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的 Newtonso ...
- Thinking in Unity3D:渲染管线中的Rendering Path
关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的 ...
- Unity3D引擎扩展中的编辑器定制方法
http://gamerboom.com/archives/36432 作者:Richard Fine Unity3D的方便之处在于,它很容易地扩展编辑器套件.每款游戏都对加工有着不同的需求,可以快速 ...
- ListView与.FindControl()方法的简单练习 #2 -- ItemUpdting事件中抓取「修改后」的值
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/24/listview_itemupdating_findcontrol_201 ...
- 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
错误提示:可能会导致循环或多重级联路径.请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束. 原因:自表连接(同一张表 ...
- 聊聊 Vue 中 title 的动态修改
由于之前的 Vue 项目打包成果物一直是嵌入集成平台中,所以一直没有关注过项目的 title.直到最近,突然有个需求,要求点击按钮在集成平台外新开一个页面,此时我才发现,原来我的项目的 title 一 ...
- TDD在Unity3D游戏项目开发中的实践
0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...
随机推荐
- python 网站 监控返回值
import requests try: code = requests.get("https://api.sudaizhijia.cm/").status_code print( ...
- 居中分栏flex完美的解决方案
盒模型实现多栏布局 div { border: 1px solid #aaf; /* 设置HTML组件的大小包括边框 */ box-sizing: border-box; padding: 5px; ...
- Lombok使用简介
1.在maven中加入Lombok引入 2.在开发环境中加入Lombok插件 3.在实体类的类名上增加注释@Date即可使用所有get,set方法
- Java学习--枚举
枚举类型enum,地位等同于class,interface 使用enum定义的枚举类型,也是一种变量类型,可用于声明变量 枚举的一些特征 1.它不能有public的构造函数,这样做可以保证客户代码没有 ...
- 如何设置.net控件SplitContainer平均分配
设置SplitterDistance为宽或者高的一半
- Redis 编译安装
系统学习一下,记录一下笔记,之前都是断断续续尝试过一些简单的安装使用 下载,解压 编译安装 copy配置文件 启动连接 ./bin/redis-server ./redis.conf 登陆./bin/ ...
- [原创] 扩展jquery-treegrid插件, 实现勾选功能和全删按钮.
新上手一个项目, 因而正好想学习下bootstrap, 所以就采用asp.net mvc + bootstrap来做. 因为需要TreeGrid的控件, 本来想用easyUI.LingerUi.DW ...
- Spring的诞生
前言:不先学习常见的设计模式直接看Spring.MyBatis等源码,简直就是一个找虐的过程!不掌握Servlet原理.基本的Tomcat容器技术上来就看Spring MVC源码同样也是一个打击自信心 ...
- Jquery 字符串转数字
其实在jquery里把字符串转换为数字,用的还是js,因为jquery本身就是用js封装编写的. 比如我们在用jquery里的ajax来更新文章的阅读次数或人气的时候,就需要用到字符串转换为数字的功能 ...
- 项目总结之Oauth2.0免登陆及相关知识点总结
简介Oauth2.0授权步骤 授权码模式的基本步骤 原文链接地址 (A)用户访问客户端,后者将前者导向认证服务器. (B)用户选择是否给予客户端授权. (C)假设用户给予授权,认证服务器将用户导向客户 ...