Unity面试编程题

32 篇文章 0 订阅
31 篇文章 0 订阅

1、实现吊机吊物体的功能

效果图


上面做了个横梁,上面一块Cube作为钩子,下面的Cube作为要吊起的重物,中间的绳子用Capsule

思路:鼠标左右滑动实现钩子的左右滑动,松开鼠标---钩子下滑,当钩子等撞到重物的时候停止下降 并带着重物一同上升,回到一定高度后,开始水平回到初始位置,并判断(是否勾住重物)如果勾住重物了 ,在原点位置,下降  然后放下重物,如果没勾住重物 则再远点不动,等待第二次操作。

在每次操作的过程中,不能进行第二次操作

结构:


上代码:

QizhongjiCS.cs控制钩子的滑动、钩子的下降、上升

using UnityEngine;  
using System.Collections;  
  
public class QizhongjiCS : MonoBehaviour {  
    private float dianX = 0;  
    public GameObject hook;  
    private float yuandianX;  
    private Vector3 hookV;  
    private int flag=0;  
    private delegate void HookMove();  
    private  HookMove _hookMove=null;  
    private int speed=3;  
  
    public HookZhongWu hzw;  
    private int zwFlag=0;  
    private GameObject zhongwu;                 //抓住的重物;  
  
    public GameObject shengzi;  
    public GameObject heng;  
    // Use this for initialization  
    void Start () {  
        hookV = hook.transform.localPosition;  
        yuandianX = hookV.x;  
    }  
      
    // Update is called once per frame  
    void Update () {  
        if (flag == 0) {  
            if (Input.GetMouseButtonDown(0))  
            {  
                dianX = Input.mousePosition.x;  
            }  
            else if (Input.GetMouseButton(0))  
            {  
                float dx = Input.mousePosition.x - dianX;  
                if (Mathf.Abs(dx) > 0.1f)  
                {  
  
                    hookV.x = yuandianX + dx / 32;  
                    if (hookV.x > -6 && hookV.x < 6)  
                    {  
                        hook.transform.localPosition = hookV;  
                    }  
  
                }  
  
  
            }  
            else if (Input.GetMouseButtonUp(0))  
            {  
                //yuandianX = hookV.x;  
                flag = 1;  
                _hookMove = hookDown;  
                StartCoroutine(downZhua());  
            }   
        }  
    }  
    IEnumerator downZhua() {  
        yield return new WaitForSeconds(0.01f);  
        //1、向下移动, +speed  
        //2、判断移动的位置 如果大于某个位置 ,返回 speed为负  
        if (_hookMove != null)  
        {  
            _hookMove();  
            yield return StartCoroutine(downZhua());  
        }  
        else {  
            yield return null;  
        }  
          
        
  
        //3、判断移动回到原点    整个钩子向原始位置水平运动  
  
        //4、判断钩子回到原点   停止协程  flag=0  
        yield return StartCoroutine(downZhua());  
    }  
    void hookDown() {  
        hook.transform.Translate(Vector3.down * Time.deltaTime * speed);  
        changeShengZi();  
        if (hook.transform.localPosition.y < -2) {  
            if (zwFlag == 1) {  
                zhongwu.transform.parent = null;  
                zhongwu = null;  
                zwFlag = 0;  
            }  
            _hookMove = hookUp;  
        }  
    }  
    void hookUp()  
    {  
        hook.transform.Translate(Vector3.up * Time.deltaTime * speed);  
        changeShengZi();  
        if (hook.transform.localPosition.y >3.2)  
        {  
             
                _hookMove = HMove;  
              
              
        }  
    }  
    void HMove()  
    {  
         
        hook.transform.Translate(Vector3.left * Time.deltaTime * speed);  
          
        if (hook.transform.localPosition.x <=-4.5)  
        {  
            if (zwFlag == 0)  
            {  
                flag = 0;  
                _hookMove = null;  
            }  
            else {  
                _hookMove = hookDown;  
            }  
              
        }  
    }  
    public void zhuaZhongWu(GameObject zhongwu) {  
        _hookMove = hookUp;  
        zwFlag = 1;  
        this.zhongwu = zhongwu;  
    }  
    void changeShengZi() {  
        Vector3 hookPosition = hook.transform.position;  
        Vector3 hengliangP = heng.transform.position;  
        float dy = hookPosition.y - hengliangP.y;  
        Vector3 shengziP = shengzi.transform.position;  
        shengziP.y = hengliangP.y + dy / 2;  
        shengzi.transform.position = shengziP;  
  
  
        //改变 绳子长度  
        Vector3 shengziSclae = shengzi.transform.localScale;  
        shengziSclae.y = dy/2;  
        shengzi.transform.localScale = shengziSclae;  
    }  
}  

----------------------------------------------

HookZhongWu.cs用来判断 钩子是否和重物碰撞

碰上的时候 将重物设置成钩子的子对象  就可以实现带着往上升的效果了

sing UnityEngine;  
using System.Collections;  
  
public class HookZhongWu : MonoBehaviour {  
    public QizhongjiCS qzj;  
    void OnTriggerEnter(Collider collision)  
    {//当碰撞时  
        print("OnTriggertEnter+" + collision.gameObject.name);  
        if (collision.gameObject.name == "zhongwu") {  
            collision.gameObject.transform.parent = this.gameObject.transform;  
            Vector3 v = collision.gameObject.transform.localPosition;  
            v.y = -1.2f;  
            collision.gameObject.transform.localPosition = v;  
            qzj.zhuaZhongWu(collision.gameObject);  
        }  
    }  
}  


2、写一个计时器工具,从整点开始计时,格式为:00:00:00

创建工程后添加一个Cube物体,为其添加一个脚本。

using UnityEngine;
using System.Collections;
public class Cube : MonoBehaviour {

    private float timer = 0f;
    private int h = 0;
    private int m = 0;
    private int s = 0;
    private string timeStr = string.Empty;

    // Update is called once per frame
    void Update () {
        timer += Time.deltaTime;
        if (timer >= 1f) {
            s++;
            timer = 0;
        }
        if (s >= 60) {
            m++;
            s = 0;
        }
        if (m >= 60) {
            h++;
            m = 0;
        }
        if (h >= 99) {
            h = 0;
        }
    }

    void OnGUI(){
        timeStr = string.Format ("{0:D2}:{1:D2}:{2:D2}", h, m, s);
        GUI.Label (new Rect (10, 10, 100, 200), timeStr);
    }
}


3、用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放

在场景中添加一个Plan,Camera,Directional Light,Cube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。

1.鼠标滚轮实现缩放:

将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下

void Update () {
        //鼠标滚轮的效果
        //Camera.main.fieldOfView 摄像机的视野
        //Camera.main.orthographicSize 摄像机的正交投影
        //Zoom out
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            if (Camera.main.fieldOfView <= 100)
                Camera.main.fieldOfView += 2;
            if (Camera.main.orthographicSize <= 20)
                Camera.main.orthographicSize += 0.5F;
        }
        //Zoom in
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            if (Camera.main.fieldOfView > 2)
                Camera.main.fieldOfView -= 2;
            if (Camera.main.orthographicSize >= 1)
                Camera.main.orthographicSize -= 0.5F;
        }
}

2.鼠标实现在场景中拖动物体:

  解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理

   主要代码如下:

void Start ()
    {
        StartCoroutine(OnMouseDown());
    }
 
    IEnumerator OnMouseDown()
    {
        //将物体由世界坐标系转换为屏幕坐标系
        Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标
        //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系 
        //    //             2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离
        //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
        while (Input.GetMouseButton(0))
        {
            //得到现在鼠标的2维坐标系位置
            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
            //将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量
            Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
            //curPosition就是物体应该的移动向量赋给transform的position属性
            transform.position = curPosition;
            yield return new WaitForFixedUpdate(); //这个很重要,循环执行
        }
    }


4、鼠标左键游戏对象使其旋转

UnityEngine;  
using System.Collections;  
public class DragRotateWithSlider : MonoBehaviour {  
      
    private bool onDrag = false;    //是否被拖拽  
    public float speed = 5f;    //旋转速度  
    private float tempSpeed;    //阻尼速度  
    private float axisX;    //鼠标沿水平方向移动的增量  
    private float axisY;    //鼠标沿垂直方向移动的增量  
    private float cXY;      //鼠标移动的距离  
  
    //接收鼠标按下的事件  
    void OnMouseDown ()   
    {  
        axisX = 0f; //为移动的增量赋初值  
        axisY = 0f;  
    }  
  
    //鼠标拖拽时的操作  
    void OnMouseDrag()  
    {  
        onDrag = true;  //被拖拽  
        axisX = Input.GetAxis("Mouse Y");   //获得鼠标增量  
        axisY = -Input.GetAxis("Mouse X");    
        cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY);    //计算鼠标移动的长度  
        if (cXY == 0f)  
        {  
            cXY = 1f;  
        }  
    }  
  
    //Count TempSpeed  
    float Rigid()   //计算阻尼速度  
    {  
        if (onDrag)  
        {  
            tempSpeed = speed;  
        }  
        else  
        {  
            if (tempSpeed > 0)  
            {  
                tempSpeed -= speed * 2 * Time.deltaTime / cXY;//通过除以鼠标移动长度实现拖拽越长速度减缓越慢  
            }  
            else  
            {  
                tempSpeed = 0;  
            }  
        }  
        return tempSpeed;   //返回阻尼的值  
    }  
  
    void Update()  
    {  
        gameObject.transform.Rotate(new Vector3(axisX, axisY, 0) * Rigid(), Space.World);  
        if (!Input.GetMouseButton(0))  
        {  
            onDrag = false;  
        }  
    }  
}






### 回答1: Unity是一款广泛使用的游戏开发引擎。它提供了可视化的编辑器界面、底层的渲染引擎以及广泛支持的插件生态系统,使得开发者可以很方便地进行游戏开发。 如果你准备参加Unity面试笔试,你需要掌握以下方面的知识: 1. 编程语言:Unity支持C#和JavaScript语言。你需要掌握其中一种或两种编程语言,并且能够熟练应用它们。 2. 游戏设计:你需要具备游戏设计的基本知识,包括游戏流程、关卡设计、角色设计、游戏平衡等方面的知识。 3. Unity编辑器:你需要熟练掌握Unity编辑器的各种工具,例如场景编辑、组件列表、资源管理等。 4. 物理引擎:Unity包含了物理引擎,你需要熟悉它的基本概念,例如重力、力、碰撞等。 5. 动画系统:游戏中的角色动画是非常重要的一部分,你需要熟悉Unity的动画系统,包括动画控制器、状态机等。 总之,如果你想要在Unity领域取得成功,你需要在以上方面进行深入学习和掌握。如果你能够在面试笔试中展现出你的知识和技能,相信你会很快获得工作机会。 ### 回答2: Unity是当前市面上非常流行的游戏引擎,而从事Unity开发的人才需求也越来越大。在面试和笔试中,可能会涉及到Unity的相关知识和技能。下面将从Unity的四个方面进行简单介绍:游戏物体、组件、Scene和Asset以及C#语言。 1. 游戏物体 在Unity中,物体(GameObject)是游戏场景中的核心对象。而每一个场景都是由若干个物体组成,物体又是由若干个组件(Component)组成的。因此,需要了解游戏物体的各种操作和属性设置,包括名称、激活状态、位置、旋转、缩放、父子关系等。 2. 组件 组件是Unity中最常用的一种对象,也是游戏物体的一个基本组成部分。它可以改变游戏物体的行为、外观和互动方式。在Unity中,可以通过添加或删除组件来更改游戏物体的属性和行为。例如,常用的组件包括:Animator、Rigidbody、Collider等。 3. Scene和Asset Scene(场景)是Unity的一个概念,是由多个游戏物体和它们的组件组成的。在进行游戏开发时,需要了解如何创建、导入和导出Scene。而Asset(资源)则是指Unity中的各种资源文件,例如:纹理、音频、3D模型、动画等。需要了解如何使用Asset Store、如何导入和设置Asset等。 4. C#语言 Unity使用C#语言作为主要的编程语言。因此,在进行Unity开发时,需要了解一些基本的C#语言语法和编程思想,包括:变量、方法、类、继承、多态、接口、委托等。此外,还需要了解一些Unity特有的API和对象模型,例如:GameObject、Component、Transform、Input、Physics等。 总体来说,对于Unity面试和笔试,需要具备扎实的Unity框架和常用组件的运用能力,同时还能够掌握C#语言的基本知识。只有掌握了这些核心技能,才能在Unity开发中不断提升自己,并为团队和项目创造出更多价值。 ### 回答3: Unity 是一款非常流行的游戏开发引擎,其在市场上占有非常重要的地位,因此很多人选择学习和使用 Unity。如何通过 Unity面试笔试来测试候选人的实际技能以及对 Unity 开发的理解和掌握程度呢? 对于 Unity面试笔试,一般会涉及以下几个方面: 1. 编程语言和算法基础 Unity 开发主要使用 C# 语言,因此需要候选人具备扎实的 C# 基础和算法基础,包括数据结构、算法思想、设计模式等方面的知识。 2. Unity 引擎和 API 掌握程度 作为 Unity 开发者,需要掌握很多 Unity 引擎和 API 的知识,比如场景管理、游戏物体与组件、UI 界面开发、动画系统、物理引擎等。针对这些方面,笔试目可能会让候选人通过代码实现相关功能或者回答相关问。 3. 项目经验和实践能力 除了理论知识,实际项目经验和实践能力也非常重要。因此,笔试目可能会涉及到一些实际场景的开发问,比如优化性能、解决 bug、协作开发等方面。 总之,Unity 面试笔试主要考察候选人的编程能力、Unity 引擎和 API 掌握程度以及项目实践能力。同时,需要候选人具备良好的沟通能力和团队合作精神,这对于实际开发非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值