刨根问底U3D---Vector3 你到底是蔬菜呢还是水果呢?

事情的起因还是因为一段代码,因为在做一个2D TileBase的游戏 所以需要有一个简单的 Tile坐标到世界坐标的变换

public static Vector3 GetTileWorldPosByTileIndex(int _tileIndexX, int _tileIndexY , Vector3 _result)
{
    if(_result == null)
    {
        _result = new Vector3();
    }
    _result.x = TileConst.TILE_WIDTH * _tileIndexX;
    _result.y = TileConst.TILE_HEIGHT * _tileIndexY;
    _result.z = 0;
    return _result;
}

代码逻辑很简单,特殊的地方就是后面传入的Vector3,因为函数会被经常调用 所以不想每次都New出来一个新的Vector3. OK 运行..

Warning CS0472: The result of comparing value type `UnityEngine.Vector3‘ with null is `false‘
Unreachable code detected

WTF?! 哪里错了? Vector3 居然不能和null 判等? 嘿经过我一通测试 果真发现一些问题

来看如下的代码

public class Test01 : MonoBehaviour
{

    void Start ()
    {
        int inputInt = 500;
        int outputInt = SetIntWithRandom (inputInt);
        Debug.Log (inputInt);
    }

    public  int SetIntWithRandom(int _input)
    {
        _input = Random.Range(-300,300);
        return _input;
    }

}

这段应该很简单,弄出来一个int 类型然后传入函数内部, 然后在Log出来 看看是否有发生改变。 Ok 运行

Log结果 500,

说明没有发生任何改变。 也就是说 int 类型的变量是 传值不是传址的

再换下一组

public class Test01 : MonoBehaviour
{

    void Start ()
    {
        int[] inputIntArray = new int[2];
        inputIntArray [0] = 500;
        int[] outputIntArray = SetIntArrayWithRandom (inputIntArray);
        Debug.Log (inputIntArray [0]);
    }

    public int[] SetIntArrayWithRandom(int[] _inputIntArray)
    {
        _inputIntArray[0] = Random.Range(-300,300);
        return _inputIntArray;
    }

}

Log结果 -89 发生改变. 对于Array来说 是传址不是传值的.

Ok 来看 Vector3

public class Test01 : MonoBehaviour
{

    void Start ()
    {
        Vector3 inputV3 = new Vector3 ();
        inputV3.x = 500;
        Vector3 outputV3 =SetV3ValueWithRandom (inputV3);
        Debug.Log (inputV3.x);
    }

    public Vector3 SetV3ValueWithRandom (Vector3 _result)
    {
        _result.x = Random.Range (-300, 300);
        return _result;
    }

}

Log结果 500.

也就是说呢, 虽然Vector3 初始化时候 需要用New 操作符, 但是Vector3 却是一个基础类型 和 float,int 一样

之前有很多类似的地方都是想节约内存不每次进行new操作,于是类中做了一个引用,然后函数时候将引用传过去。

Vector3 inputV3 = new Vector3 ();
inputV3 =SetV3ValueWithRandom (inputV3)

现在看来,其实一点都没有省...

这个也解释了 为什么再给 transfrom的position赋值时候不能

transform.position.x = 100; 这样去做 会报错说

Error CS1612: Cannot modify a value type return value of `UnityEngine.Transform.position‘. Consider storing the value in a temporary variable (CS1612)

我又做了几个相关的测试,实在懒得写了 :) 就把相关结果说一下吧(有兴趣可以私聊哈)

1· 每次去New Vector3 对性能开销大么?

我Profile了一下, 在一个Update里面 循环去new 10w个 Vector3, CPU和内存都没有任何的波动.

vod Update()
{
    Vector3 tmp;
    for(int i=0 ; i<100000;i++)
    {
        Vector3 tmp = new Vector3();
        tmp.x = Random.Range (-300, 300);
    }
    transform.position = tmp
}

也就是完全把它当int来看就好了,虽然使用的是New操作符 总感觉 要有很大动静似的...

vod Update()
{
    int tmp;
    for(int i=0 ; i<100000;i++)
    {
        tmp = Random.Range (-300, 300);
    }
}

2· 虽然开销很小 但是我还是想类中保留一个引用,然后不用每次去New出来 应该怎么做?

直接在函数的参数中改为ref即可, 感觉ref是C# 中很变态的东西 int啊 float啊什么的 都能ref (之前接触到得As3,Java是不行的 从C++上面继承来的特性吧 这个应该是)

public static void GetTileWorldPosByTileIndex(int _tileIndexX, int _tileIndexY , ref Vector3 _result)
{
    _result.x = TileConst.TILE_WIDTH * _tileIndexX;
    _result.y = TileConst.TILE_HEIGHT * _tileIndexY;
    _result.z = 0;
}

3· 注意一下 Nullable Type

可以看下这篇文章 http://unitypatterns.com/nullable-types/

两个问题,一个是说

Vector3 tmp;
Debug.Log(tmp.x) //  这里会有结果,结果是0

也就是说 Vector3 在没有new操作时候 是有默认值的 和 布尔默认值是false, int默认值是0 一个道理

第二个 如果不希望这样的话 那就要使用 牛逼操作符 问号..

Vector3? tmp;
if(tmp.HasValue)
{
    Debug.Log(tmp.Value);
}

在Vector3后面加一个问号 将其转变为Nullable Type 然后就可以用HasValue判断是否有值 然后用 xxx.Value获得这个值了

OK 继续搞游戏去了..

Best

Eran

时间: 2024-08-05 19:45:25

刨根问底U3D---Vector3 你到底是蔬菜呢还是水果呢?的相关文章

JS or C#?不存在的脚本之争

前言: 又来到了周末,小匹夫也终于有了喘口气写写博客的时间和精力.话说周五的下午,小匹夫偶然间晃了一眼蛮牛的QQ群,又看到了一个Unity3D开发中老生长谈的问题,“我的开发语言究竟是选择JavaScript呢?还是C#呢?”.对这个问题,小匹夫也觉得的确该认真的梳理一下了.那么为何说JavaScript和C#的争论根本就不存在呢?首先,我们要知道Unity3D中的Js脚本究竟是什么?最准确的学名,我想应该叫做UnityScript (因为Unity-Technologies在github上托管

【UNREAL ENGINE 游戏开发】开篇之为什么现在就要抱紧UE的大腿!(另附学习资料/交流群)

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unreal-engine-game/2129.html 自从开始自学Unreal Engine后,身边的朋友.群里的童鞋们都在问:Himi,为什么要转UE了?UE到底好在哪里?与U3D比优势到底在哪里?等各种问题.而且解释过的问题,等会还要再解释给没看到的童鞋们 - 所以Himi特意来写篇博文,统一解释UE对于我为什么会有这么大的诱惑力! 这

读明清等中国近代小说感想

空闲的时候,我也读明清小说,比如<三国演义>,我已经读了好几遍了. 由于宋代前后﹐手工业和商业的发展带来了都市的繁荣﹐为当时的民间说唱艺术的发展提供了场所和观众﹐不断扩大的市民阶层对文化娱乐的需求又大大地刺激了这种发展﹐从而产生出新的文学样式,这就是小说.小说的一出现,打破了正统诗文的垄断,以可感的形象和故事的动人走进了千家万户. <三国演义>是由元末明初的罗贯中初写定.此书生动描述了东汉末年群雄割据﹐三国鼎立﹐最後司马氏统一天下的复杂历史﹐结构宏伟﹐场面壮观﹐人物众多.有些人物颇

说说创业公司上云计算的那些事

还记得在2015年的时候,国家就制定出台了一系列推进"大众创业.万众创新"的政策措施,从产业供给侧改革层面给无数的创业者们以巨大的利好.同时也引发了大量的年轻人投身到创业的浪潮中,短短不到三年时间里,我国就诞生了差不多上百万个新的互联网创业项目.同时全国各地产业园区,高新技术什么园,创业孵化器,什么投资机构,各类的创业平台,可以说是创业热潮遍地开花.今天,你过得还好吗? 创业,一度被视作为当下这个时代的红利,年轻的创业者们更愿意接受所有的创新和改变,还可以体验那种令创业者的慌乱和惊心宛

担任产品经理阶段感慨

自我感觉还挺有产品思维的,但是在经20多天的激情燃烧之后,逐渐归于冷静和理智.主要有以下几点感觉: 1.定义产品共识. 产品开始就是需求的定义与表达.可是在需求讨论的时候发现每个人的理解都不一样,最后讨论变成了没有结论的争论,因为没有再一个共识基础下.所以发起讨论之前形成共识基础是非常有必要的.这样才能形成高效的会议. 2.产品思维的磨合. 自己做技术出生,所以考虑需求的时候特别的容易陷入具体细节流程当中去.这就很难保证在大局和实际环境中做出最有力的的决定.思考清楚一个产品到底要做什么,要比思考

全中国最穷的小伙子发财日记

一本被评价为“迎合了时代需求,直抵中国3亿草根青年神经最敏感之处”的<全中国最穷的小伙子发财日记>3月30日出版.这是一部日记体形式的小说,由曾经是落魄青年,现在成了富翁的“重庆老康”撰写,融合了重庆老康自己和周围朋友的创业经历.该书曾是天涯网热帖,此次由读客图书出版,据出版方介绍,首印即高达30万册. 重庆老康曾经落魄到快混成犀利哥了,于是他开始全面分析自己糟糕的人生,决定从身边着手,去寻找最小最近的机会,老老实实,深入一行.据出版方介绍,身无分文的重庆老康经过三年奋斗,现在拥有一家独资公司

程序员的饮食习惯(千里之行始于足下)

工作了这么多年,也从事了很多份工作,发现效率是最重要的,但经常有力不从心的时候,最后发现都是身体出了状况.最终总结人的身体就像机器一样,正如你只有保养好了机器,才能让机器正常高效的运作起来一样,只有你了解了你的身体作息习惯,合理的安排生物钟,合理的营养搭配才能让你的精神状态很好,以下是通过查询资料总结的一些饮食搭配: 高蛋白食品:抗辐射 早餐:鸡蛋.牛奶.面条.花生 中餐:多吃蛋白质高的东西,如瘦猪肉.牛肉.鸡鸭.动物内脏.鱼和豆制品等, 晚餐:就要多吃维生素高的食物,各种新鲜蔬菜,新鲜水果,还

仿美团外卖,饿了吗 两个ListView联动,左边点击切换右边,右边滑动切换左边

先上效果图: 实现思路: 1.先说右边标题: 首先,右边的数据源集合中的Javabean中含有三个属性name,type,title,而每个条目中会默认含有一个标题. 如果这是第一个条目,就让标题显示出来,再如果这个条目的类型和上一个条目的类型不一样,就让这个条目的标题显示出来,否则,就隐藏标题,  这样我们就做到了每种类型只有第一个数据标题显示出来 接着,在Listview的外层(也就是MainActivity的布局文件中),默认放一个标题(下面都称作是主标题) 最后,设置右边Listview

解读设计原则

概述 设计原则就一本菜谱,告诉我们一道美味的菜应该是什么样的,或者说需要具备什么.但是又没有一个固化或可测量的标准.写代码就和烹饪一样,只有当自己品尝以后才知其味. 1 开闭原则 定义: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展. 解读 开闭原则很简单,就是当需求变更的时候,尽量不要修改已有代码.开闭原则是整个设计原则的核心思想.如果当你发现某个需求的改动需要涉及许多地方的代码改动,