网站公告 | 全新unity3d 完整学习路线,最强课程配套、服务!详情点击
查看: 19505|回复: 50
收起左侧

[问答活动] 【Unity问答第1期】每周10道题,带你涨姿势。

  [复制链接]

[问答活动] 【Unity问答第1期】每周10道题,带你涨姿势。  [复制链接]

韩国泡菜 发表于 2015-12-14 13:31:08 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  45 浏览:  19505
肖红老师已在21楼解答,点我直达该楼层查看答案!

肖红老师在教课程链接:http://www.taikr.com/user/26039

楼层查看已恢复,可查看其他同学的作答。大部分同学的回答都很精彩!

本期易错问题为:第2题,第4题。

本期奖励名单
楼层 用户名 奖品
一等奖 18 丶邪恶馒馒酱 100元优惠券
二等奖 6 辛叙白 订制U盘
二等奖 17 九尾妖狐阿里 订制U盘
三等奖 7 raymotton 200泰课币
三等奖 9 云图 200泰课币
三等奖 16 cashhhh 200泰课币
领奖请联系QQ:252168525


每周10道题,带你涨姿势。

轻松应对面试,早日当上主程!

还有百元优惠码,订制U盘赠送!
QQ截图20151214134110.png QQ截图20151214134212.png
本期活动奖励:
一等奖1名:奖励泰课在线100元优惠券一张(可购买任意课程)。
二等奖2名:奖励16G订制U盘一个 或50元优惠券。
三等奖3名:奖励200泰课币
参与奖:50泰斗币(回答3道题以上)

活动规则:
我们每期会整理10道Unity技术相关的问题,大家在帖子里回复作答。

活动截止日期为每周四的23:59分。周五进行分数评定,并在下周一公布获奖名单。

分数将根据下列标准综合评定:
1,回答时间
2,回答题数
3,答案正确率
4,代码工整度(代码执行效率,规范,注释,是否放在代码插件内)
5,答案完善度(如举例是否恰当,描述是否清晰)
6,不与他人答案雷同(答案不唯一的题目)
7,其他(待完善)

如果你在学习或工作中,遇到不会的问题可以发到问答版块,我们也会从中挑选经典问题放入每周题库,并奖励100泰课币

本周题目:
1,让一个物体围绕某一点旋转,有几种方法?分别是什么?

2,Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。

3,向量的点积,叉积,在游戏中的应用(分别举一个例子说明)

4,请复制下列代码,并在编译器中测试
[C#] 纯文本查看 复制代码
void Start ()
{
        float a = 600.0f;
        float b = 1.0f - 80.0f / 100.0f;
        float c = a * b;
        int d = (int)c;
        Debug.Log (a);        
        Debug.Log (b);        
        Debug.Log (c);        
        Debug.Log (d);        
}

变量“d”的输出结果为多少?为什么?如果解决?

5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答)

6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?

7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?

8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现

9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?

10,Unity动态加载资源有几种方法,分别是什么?

评分

参与人数 2泰斗币 +40 贡献值 +20 热心值 +45 收起 理由
天才骆 + 5 很好的一种方式,可以学到很多知识.
孟子菇凉 + 40 + 20 + 40 赞一个!

查看全部评分

+1
19545°C
45
  • 肖红
  • 嘻嘻01251
  • 丶邪恶馒馒酱
  • niunan
  • flymoon
过: 他们

本帖被以下淘专辑推荐:

因分享而快乐,学习以自强!
肖红 发表于 2015-12-17 15:39:28 显示全部楼层
本帖最后由 肖红 于 2015-12-18 10:41 编辑




1,让一个物体围绕某一点旋转,有几种方法?分别是什么?
  • 旋转函数transform.Rotate()来实现。
  • transform的RotateAround(vector3 postion,vector3 axis,float angle)函数
  • [JavaScript] 纯文本查看 复制代码
    var obj1: Transform;
      var obj2: Transform;
      var q:Quaternion;
      q.SetLookRotation(obj1.position, obj2.position);
      transform.rotation=q;

       然后大家拖动obj1和obj2就可以看到物体永远保持z轴朝向obj1,并且以obj2的位置来保持y轴的倾斜度。

2,Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。
collider的性能和效率大概的顺序是:Sphere Collider > Capsule Collider> Box Collider > Mesh Collider.

3,向量的点积,叉积,在游戏中的应用(分别举一个例子说明)
  • 判断目标在自己的前后方位可以使用下面的方法:
[C#] 纯文本查看 复制代码
Vector3.Dot(transform.forward, target.position)
返回值为正时,目标在自己的前方,反之在自己的后方
  • 判断目标在机子的左右方位可以使用下面的方法:
[C#] 纯文本查看 复制代码
Vector3.Cross(transform.forward, target.position).y
返回值为正时,目标在自己的右方,反之在自己的左方
  • a.normalized  和  b.normalized  表示的是两个向量的单位向量, 因为在公式里,有向量和模的除法,得出来的结果就是单位向量,所以我们这里和后面都直接用单位向量来计算,省去不少麻烦。
  • Mathf.Rad2Deg 表示的是 单位弧度的度数。详情请见作者文章:  Unity3D之Mathf.Rad2Deg和Mathf.Deg2Rad
  • 通过叉积计算度数是通过公式 |c|=|a||b|sin<a,b> 来逆向求值。|c| 其实就是叉积的模,换句话说,也代表着 Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))的值。

4,输出: 600,0.2,120,119;
该方式对于浮点数会做无条件舍去,失去精确度。  
如果希望获取float的整数部分可以 d = Math.Floor(c);
  • Math.Round:四舍六入五取偶
  • Math.Ceiling:只要有小数都加1
  • Math.Floor:总是舍去小数



5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答)




6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
会发生穿透(碰撞检测失败)
解决方法:
  • 增大细小物体的碰撞体
  • 使用射线检测
  • 可以physics time减小,不建议这样做
  • 确保rigidbody不超过一定的速度,这个也不实用

7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?
Awake()-> Start()-> Update();
脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到
Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy

  • Awake:用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息Awake总是在Start之前被调用。它不能用来执行协同程序。
  • Start:仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。在所有脚本实例中,Start函数总是在Awake函数之后调用。
  • Update:正常帧更新,用于更新逻辑。每一帧都执行,处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。



8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
[C#] 纯文本查看 复制代码
         Func(n)
         {
            if (n==1) return 1;
            if (n==2) return 1;
            return Func(n-1)+Func(n-2);
         }



9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
  • 使用pool对象池。
  • 使用AssetBundle也可以降低一定内存。


10,Unity动态加载资源有几种方法,分别是什么?
  • 通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
  • 通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。
  • 通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的


答案并不标准,仅作参考。。。如果有误,请不要骂我。


评分

参与人数 3泰斗币 +21 贡献值 +10 热心值 +10 收起 理由
嘻嘻01251 + 5 很给力!
admin + 16 + 10 + 4 多谢肖老师作答
alordred + 5 + 1 给力啊,辛苦肖老师作答

查看全部评分

因分享而快乐,学习以自强!
嘻嘻01251 发表于 2015-12-18 10:52:14 显示全部楼层
肖红 发表于 2015-12-17 15:39
1,让一个物体围绕某一点旋转,有几种方法?分别是什么?
  • 旋转函数transform.Rotate()来实现。
  • tr ...

  • 谢谢老师 学到很多
    因分享而快乐,学习以自强!
    丶邪恶馒馒酱 发表于 2015-12-16 21:39:55 显示全部楼层
    1,让一个物体围绕某一点旋转,有几种方法?分别是什么?
    建立一个空物体,再建立一个子物体挂在空物体之下,可使其绕父级物体转动。
    使用自定义路径引导物体做圆周运动。
    也可以使用内置的几种方法完成
    myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime)类似的方法完成;
    或transform .RotateAround(Center.position, Axis, Angle);

    2,Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。
    性能开销由小到大排序
    sphere collider , capsule collider , box collider , Mesh collider

    3,向量的点积,叉积,在游戏中的应用(分别举一个例子说明)
    通过点积Vector3.Dot,可以计算两个向量的夹角的。 Vector3.Cross 可以求两个向量的叉积。
    通过点积可以计算两个向量的夹角,叉积可以判断目标在自己的方位。向量单位化后可以在游戏中用来计算怪物视野张角;玩家视野张角;NPC视野张角等,完成巡逻索敌等一些功能。

    4,请复制下列代码,并在编译器中测试:
    [C#] 纯文本查看 复制代码
    void Start ()
    {
            float a = 600.0f;
            float b = 1.0f - 80.0f / 100.0f;
            float c = a * b;
            int d = (int)c;
            Debug.Log (a);        
            Debug.Log (b);        
            Debug.Log (c);        
            Debug.Log (d);        
    }

    变量“d”的输出结果为多少?为什么?如果解决?
    首先,变量“d”的输出结果为119。
    先解释为什么:在程序中精确计算中使用浮点数是非常危险的,尽管C#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话(浮点数由于是计算机内部求补运算而进行的,因此可能存在误差。),将造成非常严重的隐患。而且在精度损失的时候,不会报告任何的错误,也不会有任何的异常产生~
    小数多位后容易出现误差,使用double会看得更多有效数字,但依然会有误差,最后真正强转为int的实际上是一个199.9……无限接近于200的数,这个时候,应该改变计算公式。或者把最后的int d = (int)c;改为更高精度的decimal。即可正常。
    最后,所有的浮点型变量都存在精度损失的问题!而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!如做大数据的百度,谷歌,财政等,肯定很多时候都要考虑这种问题。

    5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答)
    1.修改脚本中的RenderQueue值。
    2.使用另外一个摄像机,显示特效。
    3.修改粒子特效的Shader中的RendererQueue值。
    4.结合其他设置,还可以通过3D空间中的Z轴调整

    6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
       穿透(碰撞检测失败)
       碰撞体变大, FixedUpdate频率修改。代码限制,加大计算量提前计算好下一个位置。

    7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?
    Awake——>Start——>Update
    当该MonoBehavior在编辑器中被赋于给GameObject的时候,Awake, Start 将被执行。

    8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
        public int function(int n)
        {
            if (n == 1 || n == 2)
                return 1;
            else
                return function(n - 1) + function(n - 2);
        }

    9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
    使用对象池,预先创建好要使用的物体,使用的时候从池里面取,用完之后放回去。
    切换场景之后可以进行回收。理想状态下自己管理所有的对象,CG机制只起辅助作用。

    10,Unity动态加载资源有几种方法,分别是什么?
    1.Resources.Load();
    2.AssetBundle
    Resources资源的加载是动态加载内部的,AssetBundle 是动态加载外部的 .
    Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。

    因分享而快乐,学习以自强!
    niunan 发表于 2015-12-14 14:27:02 显示全部楼层
    1,让一个物体围绕某一点旋转,有几种方法?分别是什么? (不会)

    2,Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。 (不会)

    3,向量的点积,叉积,在游戏中的应用(分别举一个例子说明) (不会)

    4,请看下列代码


    [C#] 纯文本查看 复制代码
    void Start ()
    {
            float a = 600.0f;
            float b = 1.0f - 80.0f / 100.0f;
            float c = a * b;
            int d = (int)c;
            Debug.Log (a);        
            Debug.Log (b);        
            Debug.Log (c);        
            Debug.Log (d);        
    }

    变量“d”的输出结果为多少?为什么?如果解决?
    答:d=120, a=600, b=0.2, c=120

    5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答) (不会)

    6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免? (不会)

    7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?
    答:Awake → Start → Update

    8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
    答:        
          // 1,1,2,3,5,8,13... 使用:求第N位,则Func(n)
          public int Func(int x) {
                if (x ==1 )
                {
                    return 1;
                }
                if (x<1)
                {
                    return 0;
                }
                return Func(x-1) + Func(x-2);   
            }


    9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
    答:事先创建多个对象,用到一个赋值一个,用完则设置为null

    10,Unity动态加载资源有几种方法,分别是什么?(不会)
    因分享而快乐,学习以自强!
    flymoon 发表于 2015-12-14 15:08:53 显示全部楼层
    1、欧拉角,四元数,旋转矩阵?
    2、Sphere,Capsule,Box,Mesh。
    3、点积可以用来计算两个向量的夹角,假如角色攻击范围有限制,可以用来计算敌人是否在角色的攻击范围之内,叉积可以在光照计算中用来计算两个向量及其差构成的三角面的法向量.
    4、d结果是119,不知道.
    5、不会
    6、碰撞检测失败,怎么避免我也不知道。。。
    7、Awake → Start → Update,只要这个脚本挂载在GameObject上,不管是否enable,首先执行Awake,然后如果enable是true的,则开始执行Start,然后每帧执行update,然后如果enable是false的,starthe update不执行。
    8、        public int Fibonacci(int x)
        {
            if (x == 1||x==2)
            {
                return 1;
            }
          
            return Fibonacci(x - 1) + Fibonacci(x - 2);
        }
    9、使用对象池
    10、一是Resources.Load,二是通过AssetBundle。
    因分享而快乐,学习以自强!
    辛叙白 发表于 2015-12-14 16:06:38 显示全部楼层
    本帖最后由 辛叙白 于 2015-12-14 19:44 编辑

    1,让一个物体围绕某一点旋转,有几种方法?分别是什么?答:1.欧拉角 Transform.eulerAngles(旋转角度无负数,0度-360度)Transform. Rotate(围绕自身某点某轴旋转)  Transform. RotateAround(围绕世界坐标点旋转)
           2. 四元数 Quaternion(欧拉角存在万向节死锁,有时就需要四元数来实现欧拉角达不到的一个效果)
    2,Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。
    答:Sphere,Capsule,Box,Mesh
    3,向量的点积,叉积,在游戏中的应用(分别举一个例子说明)
    答:点积-(Vector3.Dot)返回值是标量,利用点积可以判断两个向量是否垂直,在计算机图形学和游戏变成中,要经常计算一个向量在另一个向量上的投影分量大小,这时就可以使用点积来完成这        种运算。
           叉积-(Vector3.Cross),利用叉积可以实现坦克旋转一定角度攻击目标。也可以利用多次叉积实现玩家定向指南针效果,还可以判断两条线段是否相交

    4,请复制下列代码,并在编译器中测试:
    答:C是120,D是119 。高精度强制转换低精度就会必然丢失精度。将D的类型换成float,或者double,long double等高精度类型。
           或者高精度强制转换低精度手动加一点浮动数例如   int d = (int)(c+0.1);

    5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答)
    答:改变Cancas画布的RenderMode。改变粒子的坐标实现播放位子
    6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
    答:会穿透
          1增大碰撞体。      
          2将要碰撞时施加反作用拉力减速碰撞。
          3可以修改FixedUpdate的每帧作用时间 。

    7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?
    答:1,Awake()  脚本实例化被创建时调用。脚本未启用也会执行。
           2,Start()   Update()运行前Awake()之后调用,用于游戏的初始化。
           3,Update()在Start()之后每帧调用一次时间不是固定的,用于游戏更新场景和状态。


    8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
    答:基础题,就是兔子繁衍的问题
        class Program    {
            static int taiker(int i)//首先创建一个函数。
            {
                if (i < 3)
                {
                    return 1;//返回 1 前两位数是 1。
                }
                else
                {
                    return taiker(i - 1) + taiker(i - 2);
                    //否则返回。前两项的和。
                }

            }

            static void Main(string[] args)
            {
                Console.WriteLine("请输入你要查询的项数");
                int i = int.Parse(Console.ReadLine());
                Console.WriteLine(taiker(i));//调用taiker这个函数。
                Console.ReadKey();
            }
        }

    9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
    答:使用对象池,将要重复创建的对象先创建一定的数量,然后隐藏起来,当要使用的时候在显示出来,插件pool manager也可以。
    10,Unity动态加载资源有几种方法,分别是什么?
    答:1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
           2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。
           3.通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的




    点评

    来来回回改好几次 - - 没排版,没加颜色,,,,  发表于 2015-12-14 22:21
    因分享而快乐,学习以自强!
    raymotton 发表于 2015-12-14 16:10:58 显示全部楼层
    本帖最后由 raymotton 于 2015-12-14 16:14 编辑

    1,让一个物体围绕某一点旋转,有几种方法?分别是什么?
    • Transform.RotateAround()
    • 将物体变为作为点的空物体的子物体,然后让空物体自转

    2,Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。
    • Sphere,Capsule,Box,Mesh

    3,向量的点积,叉积,在游戏中的应用(分别举一个例子说明)
    • 点积:模拟飞机飞行的状态,当飞机与vector3.up的点积等于0,证明飞机平行飞行;当小于0时候,证明飞机向下飞行;当大于0时候,证明飞机向上飞行。
    • 叉积:通过计算当前面向的方向向量和目标与玩家的方向向量计算出转动轴,从而让玩家旋转

    4,请复制下列代码,并在编译器中测试:
    [C#] 纯文本查看 复制代码
    void Start ()
    {
            float a = 600.0f;
            float b = 1.0f - 80.0f / 100.0f;
            float c = a * b;
            int d = (int)c;
            Debug.Log (a);        
            Debug.Log (b);        
            Debug.Log (c);        
            Debug.Log (d);        
    }


    变量“d”的输出结果为多少?为什么?如果解决?
    • 变量“d”的输出结果为 119,因为float类型无法做到非常精确,只是非常接近,转成int时候会舍去小数部分

    5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答)
    • UGUI的Canvas使用World Space或Screen Space - Camera模式,通过改变位置让粒子更接近摄像机

    6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
    • 可能会穿透(碰撞检测失败)物体,将检测方式改为连续检测,或者改变物体的大小或速度。

    7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?
    • Awake(),Start(),Update()。
    • Awake:当脚本实例被加载时会调用Awake函数;Awake函数在所有的游戏对象被初始化完毕之后才会被调用;无论脚本是否启用Awake都会执行
    • Start:当Update函数第一次被调用前会调用Start函数;Start函数总是在Awake函数之后执行
    • Update:每一帧都执行

    8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
    [C#] 纯文本查看 复制代码
    int[] a=new int[n];
     a[0]=1;
     a[1]=1;
     for(int i=2;i<n;i++)
    {
        a[i]=a[i-1]+a[i-2];
    }


    9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
    • 使用对象池,将要重复创建的对象先创建一定的数量,然后隐藏起来,当要使用的时候在显示出来。

    10,Unity动态加载资源有几种方法,分别是什么?
    • 通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。Resources.Load();
    • 通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。AssetBundle
    • 通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的



    点评

    看好你哦!  发表于 2015-12-14 16:16
    因分享而快乐,学习以自强!
    怒放的生命2015 发表于 2015-12-14 17:12:10 显示全部楼层
    1.Transform.RotateAround()
    2.Sphere,Capsule,Box,Mesh
    3.点乘:计算对象行走距离,叉乘:计算敌人与主角的朝向。
    4.120
    5.UGUI的Canvas使用World Space或Screen Space - Camera模式,通过改变位置让粒子更接近摄像机
    6.会穿过去,要加collider
    7.Awake(),Start(),Update()
       Awake用于在游戏开始之前初始化变量或游戏状态;Start仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和     Awake的不同是Start只在脚本实例被启用时调用;Update:每一帧都执行.
    8.f(n)=f(n-1)+f(n-2);
    9.Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大。 Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的.
    10.动态load资源的几种途径:
       -通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
            -通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。
            -通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的

           Resources的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以unity推荐的方式是不用它,都用bundle的方式替代,把资源达成几个小的bundle,用哪个就load哪个,这样还能分包发布和patch,但是在开发过程中,不可能没更新一个资源就打一次bundle,所以editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,在不同的环境下做不同实现。
    因分享而快乐,学习以自强!
    云图 发表于 2015-12-14 17:16:20 显示全部楼层
    1,让一个物体围绕某一点旋转,有几种方法?分别是什么?
            答:transform.RotateAround(//这里放需要环绕的物体的vector 3 值);                或者给需要环绕的物体做成自己的父物体,通过调整距离改变自身localrotation也可以实现
    2,Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。
    答:sphere -capsule- box- mesh  碰撞效率取决于顶点多少  尽量少使用mesh box
    3,向量的点积,叉积,在游戏中的应用(分别举一个例子说明)
    答:  向量的点积可以计算两个物体之间的夹角,可以做游戏怪物的视角是否有查看到玩家,AI里面会有大量体现(如 怪物的追逐行为,躲避行为)  向量的叉积可以计算两个物体之间形成四边形的面积,或者法向量,可以做一些单体技能的释放范围或者距离,和计算两物体之间的垂直方向
    4,请复制下列代码,并在编译器中测试:
    [C#] 纯文本查看 复制代码
    void Start ()
    {
            float a = 600.0f;
            float b = 1.0f - 80.0f / 100.0f;
            float c = a * b;
            int d = (int)c;
            Debug.Log (a);        
            Debug.Log (b);        
            Debug.Log (c);        
            Debug.Log (d);        
    }

    变量“d”的输出结果为多少?为什么?如果解决?
    答:float强制转换int会有四舍五入。在代码加上0.5即可解决
    代码改成  int d = (int) (c + 0.5f);
    不知道这样做是否正确,求大神解答
    5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答)
    答:ngui的话 最好是把粒子都添加自定义 粒子层,新建一个相机 只做渲染粒子层,在其他相机渲染层前面 (方便脑洞大开的策划更改粒子需求)
           ugui 原理也可以同上 ,或者把摄像机改成World Space 粒子调节z轴
    6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
    答:很有可能会穿过去而没有碰到,可以用计算细小的高速物体和较大物体的距离来计算,就可以避免这种情况
    7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?
    答:游戏开始后 先执行awake  然后初始化后执行是Start 最后每帧都会调用update
    8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
    答:不会
    9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
    答:采用对象池,尽量减少生成 或者从resources里面热加载, 可直接使用一个 ,用完后隐藏起来,重置参数和位置,以便下一次利用
    10,Unity动态加载资源有几种方法,分别是什么?
    答:Resources.load();
    打包AssetBundle 通过下载服务器的资源来加载

    因分享而快乐,学习以自强!
    金生水起666 发表于 2015-12-15 11:06:07 显示全部楼层
    1、
    2、Box>Sphere>Capsule>Mesh
    3、
    4、d 输出119,因为char在内存中是以int类型存储的,所以直接转换得到的不是确定的值int d = (int)c;改为int d=int.Parse(c.ToString());
    5、
    6、
    7、执行顺序:Awake(),Start(),Update()
    8、
    9、
    10、
    因分享而快乐,学习以自强!
    哎呀我去 发表于 2015-12-15 11:26:59 显示全部楼层
    1. 1.1 transfrom.Rotate() 1.2 transfrom.RotateAround()  1.3 Quaternion.Euler()
    2. Box<Sphere<Capsule<Mesh
    3. 3.1 Vector3.Dot() 求夹角 判断两个物体的方向  Shader中实现下雪的效果
       3.2 Vector3.Cross()  大概的意思应该是 求出垂直一个平面的向量  具体没有应用到  sorry
    4. d 输出结果 119  Why?
    5. NGUI为列 设置UIPanel的RenderQ<3000
    6  碰撞检测失败(穿透) 解决方法可能有 碰撞体增大 或者 增加代码显示用Fixupdate来检测
    7. Awake()早于Start()早于Update() 游戏开始后 在脚本初始化的时候执行 Awake() 然后 Start() 每帧执行Update()
    8.  void Start()
        {
            int d = Test(n);
        }


        int Test(int i)
        {
            if (i == 0) return 1;
            if (i == 1) return 1;
            else
                return Test(i - 1) + Test(i - 2);

        }

    9. 创建对象池或者只有在第一次的时候加载该对象,然后设置该对象的显示和隐藏
    10. Resources.Load() AssetBundle
    因分享而快乐,学习以自强!
    qianssx 发表于 2015-12-15 11:33:04 显示全部楼层
    本帖最后由 qianssx 于 2015-12-15 11:35 编辑

    1. RotateAround(Vector3 point, Vector3 axis, float angle);    矩阵变换(在上班,写个二维的旋转先用着,绕Z轴转,三维的有时间在写吧)     
    float radious;     //半径     
    Vector3 vec = new Vector3(0, 2, 0);//绕点     
    Vector3 newVec = new Vector3();           
    void Start()     
    {         
    radious = Vector3.Distance(transform.position, vec);     
    }         
    void Update()     
    {         
    newVec.x = radious * (Mathf.Cos(Time.time) - Mathf.Sin(Time.time)) + vec.x;         
    newVec.y = radious * (Mathf.Sin(Time.time) + Mathf.Cos(Time.time)) + vec.y;        
    transform.position = newVec;     
    }
    2.性能无非就是计算复杂度   Box,Sphere,Capsule,Mesh、
    3.点积可以得到你当前的面朝向的方向和你到敌人的方向的所成角度大小   叉积可以得到敌人在你的左边还是右边
    4.精度问题,c实际是199.999...,强转int默认向下取整,如果想得到120的值,可使用Mathf.CeilToInt(c);
    5.更改panel和粒子的sortingOrder
    6.是穿越吗?考虑加大碰撞网格
    7.Awake(场景加载,一次) start(脚本开始运行,一次) update(代码执行,多次)
    8.  int Cal(int n)     
    {         
    if (n == 1 || n == 2) return 1;         
    return Cal(n-1) + Cal(n-2);     
    }
    9.对象池 ,已经有这样的插件了,没必要重复造轮子,好像是叫ManagerPool什么鬼的
    10.直接加载  特殊目录下有 Resource.Load  StreamingAsset AssetBundle   做编辑器还可以考虑AssetDatabase,File类


    因分享而快乐,学习以自强!
    旧街上木 发表于 2015-12-15 16:56:43 显示全部楼层
    1.Transform.RotateAround()
    因分享而快乐,学习以自强!
    g17771765 发表于 2015-12-15 18:29:01 显示全部楼层
    第四题 120是119.99999999999999999999999999999999999999999999 取整 0.99999999999999999999999就被砍掉了 也许大概有可能就是这样吧
    因分享而快乐,学习以自强!
    Wahh_1314 发表于 2015-12-15 18:50:36 显示全部楼层
    1,答案:1.数学计算通过矩阵相乘。2.调用API RotaAround
    2,Box\Sphere\Capsule\Mesh
    3,向量的点乘:在游戏中例如秘密行动:要判断敌人是否在Player的正前方,这个时候我们就可以用敌人的方向点乘Player的方向得到两个方向的夹角余弦。判断大于0或者小于0就可以判断在正前方还是后方。
    向量的叉乘:在游戏中如果要给敌人加AI 自动追寻Player,那么我们可以用敌人的方向叉乘Player的方向得到敌人在Player的顺时针或者逆时针。使得敌人更加快速平滑的转动。
    4,d的输出结果120.
    a = 600.0f;
    b = 1.0f - 80.0f/100.0f = 1.0f - 0.8f = 0.2f;
    c = a * b = 600.0f * 0.2f = 120.0f;
    d = (int) c =  120;
    原因? 不懂什么意思,至少要告诉你的代码意图是什么我才能知道代码错在哪儿。
    5,改变渲染粒子特效的Camera和UI的Camera的层级关系
    6,可能会使得小物体的collider无效,使得小物体穿过大物体。小物体的时候在update里面记录前后两帧。然后发射线。用射线检测碰撞。
    7,Awake()Start()Update()
    Awake()是在该脚本首次被激活的时候自动调用也是第一个被调用的函数。
    Start()是在Awake()之后。
    Update是在每帧调用
    8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
    int GetNum(int i)
    {
            if(i == 1 || i == 2)
                    return 1;
            else return GetNum(i-1)+GetNum(i-2);
    }
    我们可以加个记忆数组来使得算法可以更加高效。
    因为 数组的数非负。
    初始Num[]数组初始全为负数。
    int GetNum(int i)
    {
            if(i == 1 || i == 2)
                    return 1;
            if(Num[i]> 0)return Num[i];
            else return Num[i] = GetNum(i-1)+GetNum(i-2);
    }

    9,对象池。销毁对象的时候选择不销毁而是隐藏。生成的时候不是生成而是显示,只有当池子里面没有对象才去生成。

    10,文件加载。或者把资源放在Resource文件夹里面,。然后用Resource的API加载。
    因分享而快乐,学习以自强!
    cashhhh 发表于 2015-12-15 19:42:59 显示全部楼层
    1,让一个物体围绕某一点旋转,有几种方法?分别是什么?

    Transfrom.RotateAround()
    Transfrom.localRotation()

    2.Mesh,Sphere,Box,Capsule,四种碰撞器。请按照性能开销由小到大进行排序。

    Sphere,Capsule,box,Mesh

    3.向量的点积,叉积,在游戏中的应用(分别举一个例子说明)

    点积:计算两个向量的夹角,用以制作怪物的视野范围
    叉积:判断物体之间是否相交


    4,请复制下列代码,并在编译器中测试:


    [C#] 纯文本查看 复制代码
    void Start ()
    {
            float a = 600.0f;
            float b = 1.0f - 80.0f / 100.0f;
            float c = a * b;
            int d = (int)c;
            Debug.Log (a);        
            Debug.Log (b);        
            Debug.Log (c);        
            Debug.Log (d);        
    }
    变量D输出结果为119,
    因为float转换为int类型时float类型的小数点只是无限逼近,并不是真正等于120,所以转变成int时,int取消小数点后为119,
    使用Mathf.CeilToint



    5,如何让粒子效果显示在UI前面?(NGUI或UGUI选其一回答)

        UGUI: 把画布(Canvas)里的Canvas的RenderMode参数改成
        World Space
         再调整粒子的Z值就可以了

    6,当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?

    细小物体穿透较大物体。
    减慢细小物体的速度。

    7,Update(),Awake(),Start()的执行顺序是?游戏开始后,分别在何时执行?

    Awake() ------Start()------Update()

    Awake()在游戏开始前,
    Start() 在游戏开始后的第一时间
    Update()在每一帧运行时。


    8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
       
    public static int Foo(int i)
        {
            if (i <= 0)
                return 0;
            else if (i > 0 && i <= 2)
                return 1;
            else return Foo(i - 1) + Foo(i - 2);
        }

    9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
    保存成prefab,物体对象从prefab里拖拽生成。
    做对象池,在该模块产生前,先生成该对象到需要时setactive即可。

    10,Unity动态加载资源有几种方法,分别是什么?
    Resource.Load();
    通过assetBundle从服务器或者本地磁盘下载
    通过AssetDatabase.loadasset;



    因分享而快乐,学习以自强!
    遂初 发表于 2015-12-16 10:18:11 显示全部楼层
    1、两种?transform.RotateAround或四元数貌似都能实现。
    2、sphere/capsule/box/mesh
    7、Awake()/Start()/Update(),awake和start只在一开始执行,update每一帧都会执行
    9、预制物体prefab
    10、两种Resources.Load和AssetBundle
    因分享而快乐,学习以自强!
    1234下一页
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 浙ICP 备 13006852号-15 )|网站地图

    © 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

    1
    QQ