秋招最后的总结

跑了大概有两个多星期了,笔试面试宣讲会都去过,广州大学城也走了个遍,七进七出广州,我妈说我不在大学城读过书也算是走了一回大学城了。
虽然拿到的不是工资很高的offer,也不是什么大厂,但是也算是我心仪的目标了,我这个人本来应该是那种得到了一个就想要更好的那种人,但这次我竟然选择了妥协,因为我知道继续这样浪费时间和经历,倒不如好好地学习。
但是人生总是解决了一个困难却又会出现另一个困难(租房问题),而且总是要自己一个去面对,也许这就是成长。
不过还是先总结最后的两次面试吧。

问题一:如果UI中有多个组件(按钮,图片等)该怎么去优化?
https://www.jianshu.com/p/061e67308e5f
1.重复利用的小贴图可以打成图集。
2.同种类型的组件尽量放在一起渲染,假如Image的同级有Image和Text,尽量把同级的相同组件放在一起,避免渲染中断。
3.尽量少用mask

问题二:吃鸡中的降落伞降落时逐渐清晰是怎么实现的?
答:利用了LOD技术,就是通过远近来加载不同的片面数的(清晰度)模型,具体查看盲点分析的LOD技术。

问题三:另外两个贴图其中都用了一张相同的贴图,这两个物品占用多少份内存,DrawCall是多少?
Texture的格式和内存:https://blog.csdn.net/highning0007/article/details/37991255
答:这个问题问得我一脸懵逼,不知道是我记错了还是他问得有问题。如果这两个贴图是相同的可能是一份内存,一次DrawCall,如果两个贴图是不同的,占用两份内存,DrawCall还要看贴图中有其他的贴图,不知道是不是这样理解。

问题四:LookAt是怎么实现的?
https://www.52pojie.cn/thread-763950-1-1.html
答:网站里面第三种方法比较可靠,2d的时候,以物体的中心为圆心作一个圆,物体与目标连线 与圆的交点为物体对目标的朝向。通过相似三角型我们可以计算出两者的距离和夹角,知道夹角后就可以知道朝向了。
3d的时候,我们需要以物体中心为球心作一个球,但是算法还是没有变化。但是朝向好像就更加复杂了,一个是三角形的夹角,而另一个是距离投影与x轴或者是y轴的夹角。
这个计算都要基于一个基础就是怎么把一个物体放到另一个物体的本地坐标进行计算。也就是说怎么才能把一个物体的世界坐标转换到另一个物体的本地坐标系下。
儿子的世界坐标系=父亲的世界坐标系+儿子的相对坐标系
我们可以把物体当作父亲,目标当作儿子,目标的世界坐标-物体的世界坐标=目标的相对坐标。知道了目标相对于物体的坐标再按照上面的计算即可。(如果有错请留言我修改)

问题五:透明材质的shader怎么写?
这个问题等我看完shader基本教程再回来回答。

问题六:unity新版本的新功能?
2017和2018确实增加了很多让人眼前一亮的新功能:比如说2d地图编辑器,模型导入后还能自定义修改(以前不能修改),shader蓝图,2d骨骼动画(以前也借助插件)等
2017.2的新功能:http://forum.china.unity3d.com/thread-28267-1-1.html
2018的新功能:https://blogs.unity3d.com/cn/2018/05/02/2018-1-is-now-available/?utm_campaign=saas_china_announcement_2018-05-Unity-2018.1-launch-CN&utm_content=2018-artist-2018.1-release-CN-2&utm_medium=email&utm_source=Eloqua
有空还是自己去查看一下英文文档比较好。

问题七:背包系统有1000个物品同时加载会卡,如何去优化?
答:我想到的是分页处理,百度上也没有更好的方法,首先先把物体分成十页,然后先加载两页,保证切换的时候不会卡,然后切换页的时候,同时加载下一页的物品。当然我们也可以分多一点页数,但是这样用户的体验就不是很好。

问题八:知道两个向量如何求夹角?
向量点乘(数量积)=两个向量的模相乘再乘以cos夹角
数量积求法=x1x2+y1y2
知道向量便知道数量积和模了,求出角度也就是计算问题了。

问题九:敌人的自动巡逻怎么实现?
https://www.jianshu.com/p/63ef4fc56f2e
先说说我的想法,我的想法是先输入8个方向,上下左右,左上左下,右上右下,然后随机选择一个方向作为巡逻方向,同时必须更新朝向,这个巡逻方向维持一段时间(不能太快,否则没意义),然后再选择与本来巡逻方向不一样的一个方向来进行第二次巡逻,一直到碰到障碍物要掉头,接近主角要有追踪的功能(unity的自动寻路系统),一定范围内攻击,主角走远就重新变回巡逻状态。

问题十:切水果的指尖滑动用什么函数来判断?
直接对屏幕坐标做每两帧做射线检测(Camera.main.ScreenPointToRay)

public class MouseControl : MonoBehaviour {
[SerializeField]
private LineRenderer lineRenderer;//画线组件
[SerializeField]
private AudioSource swing;
private bool firstMouseDown=false;//第一次按下
private bool mouseDown=false;//鼠标是否按下

void Update () {
    if (Input.GetMouseButtonDown(0))//按下鼠标
    {
        firstMouseDown = true;//第一次按下标记
        mouseDown =true;//按下
        swing.Play();
    }
    if (Input.GetMouseButtonUp(0))//离开就取消
    {
        mouseDown = false;//松开

    }
   
    OnDrawLine();//做切痕
    firstMouseDown = false;//
}
private Vector3[] position =new Vector3[10];
private Vector3 head;//这一帧
private Vector3 last;//上一帧
private int posCount;//记录点数是否够十个,够了十个则清零
private void OnDrawLine()
{
     if(firstMouseDown)
     {
         posCount = 0;
       //  head = Camera.main.ScreenToWorldPoint(Input.mousePosition);//换成世界坐标
       //  last = head;//只有一帧的情况   
         head = Input.mousePosition;//屏幕坐标
         last = head;
     }
     if(mouseDown)//两帧两帧来进行画切痕
     {

         
        // head = Camera.main.ScreenToWorldPoint(Input.mousePosition);
         head = Input.mousePosition;
         if(Vector3.Distance(head,last)>0.01f)
         {
             
             SavePosition(Camera.main.ScreenToWorldPoint(head));//记录位置
             posCount++;
             OnRayCast(head);//每一帧都射线检测
             OnRayCast(last);
         }
         last=head;
         
     }
     else
     {
         this.position = new Vector3[10]; //松开就直接更新
     }
     ChangePosition(position);//更新切痕的位置
}

private void OnRayCast(Vector3 screenPos)//这个是切水果检测,x需要的是屏幕坐标
{
    Ray ray = Camera.main.ScreenPointToRay(screenPos);
    RaycastHit[] hits = Physics.RaycastAll(ray);
    for (int i = 0; i < hits.Length; i++)
    {
        Destroy(hits[i].collider.gameObject);
        hits[i].collider.gameObject.SendMessage("OnCut", SendMessageOptions.DontRequireReceiver);
    }
}
private void SavePosition(Vector3 worldPos)
{
    worldPos.z = 0;
    if(posCount<=9)
    {
        for(int i=posCount;i<=9;i++)
        {
            position[i] = worldPos;
        }
    }
    else//大于10
    {
        for(int i=0;i<9;i++)
        {
            position[i]=position[i+1];//全部前移
        }
        position[9] = worldPos;//最后一个为最新的坐标
        if(!swing.isPlaying)
        {
            swing.Play();
        }
        
    }
}
private void ChangePosition(Vector3[] positions )
{
    lineRenderer.SetPositions(positions);//这里需要的是世界坐标
}

}
问题十一:卡牌点击用到的是什么函数和组件?

    enter = new UnityAction<BaseEventData>(OnPointerEnterDelegate);//括号里面是自己写的事件函数
    exit = new UnityAction<BaseEventData>(OnPointerExitDelegate);
    click = new UnityAction<BaseEventData>(OnPointerClickDelegate);
    trigger = gameObject.AddComponent<EventTrigger>();
    entry = new EventTrigger.Entry();
    entry1 = new EventTrigger.Entry();
    entry2 = new EventTrigger.Entry();
    entry.eventID = EventTriggerType.PointerEnter;
    entry1.eventID = EventTriggerType.PointerExit;
    entry2.eventID = EventTriggerType.PointerClick;
    entry.callback.AddListener(enter);
    entry1.callback.AddListener(exit);
    entry2.callback.AddListener(click);
    trigger.triggers.Add(entry);
    trigger.triggers.Add(entry1);
    trigger.triggers.Add(entry2);
    //enter,exit,click分别代表鼠标的进入,离开和点击

问题十二:字典与数组的区别,字典的好处,枚举类型的好处?
List是c#中的动态数组
Dictionary是c#中的字典
两者都引入了泛型的概念
字典的索引可以是任何东西,可以做一对一的映射关系
数组的索引只能是数字
利用枚举类型进行索引可以更清晰地知道该索引是什么,里面的值有什么用,解决了int类型模糊索引问题

c#中的内置链表:LinkedList<T> link

问题十三:观察者模式
http://www.tracefact.net/tech/009.html

问题十四:本地坐标怎么转换成世界坐标?
第一个方法:transform.TransformPoint( )
这个方法的返回值就是Vector3类型的世界坐标,transform就是相对的物体,括号里的就是相对于这个transform的本地坐标(相对偏移量)
第二个方法:儿子的世界坐标系=父亲的世界坐标系+儿子的相对坐标系
图形学实现方法:
shader实现方法:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值