[Unity3d]3D车展之汽车开门关门和旋转缩放的效果的实现

简介: 最近在一个3D汽车虚拟展示的项目,将其中的汽车开门关门的脚本简单的介绍一下吧,主要的原理就是通过从摄像机发射一个到屏幕点击的位置的一个射线,然后判断这个射线是否碰到你想要碰到的位置,如果碰到则实现逻辑过程。

最近在一个3D汽车虚拟展示的项目,将其中的汽车开门关门的脚本简单的介绍一下吧,主要的原理就是通过从摄像机发射一个到屏幕点击的位置的一个射线,然后判断这个射线是否碰到你想要碰到的位置,如果碰到则实现逻辑过程。旋转缩放就是将摄像机围绕着汽车为轴心进行旋转,缩放就是改变摄像机的视角范围,原理就是这么简单,接着上代码:

1.开关车门:

using UnityEngine;
using System.Collections;

public class opendoor : MonoBehaviour {

    private bool isOpenDoor = false;
    private bool openDoor = false;
    private bool closeDoor = false;
    private int target = 0;
    int flag = 0;
    Ray ray;
    RaycastHit hitobj;
    private GameObject doorl;
	// Use this for initialization
	void Start () {
        doorl = GameObject.Find("doorL");
        
	}
	
	// Update is called once per frame
	void Update () {
        //画出射线
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
	    if (Input.GetMouseButtonDown(0))
	    {
            //鼠标点击车门
            if (Physics.Raycast(ray,out hitobj,1000))
            {
                print("ddd");
                Debug.DrawLine(ray.origin, hitobj.point);
                if (hitobj.collider.name == "doorL")
                {
                    print("111");
                    if (flag == 0)
                    {
                        openDoor = true;
                        closeDoor = false;
                    }
                    else
                    {
                        closeDoor = true;
                        openDoor = false;
                    }

                    flag++;
                    flag %= 2;
                }
            }
	    }
	    if (openDoor)
	    {
            //开门
            if (target < 40 && !isOpenDoor)
            {
                doorl.transform.Rotate(Vector3.forward, 1);
                target = target + 1;
            }
            else
            {
                isOpenDoor = true;
            }
	    }
	    if(closeDoor)
        {
            //关门
            if (isOpenDoor && target > 0)
            {
                doorl.transform.Rotate(-Vector3.forward, 1);
                target -= 1;
            }
            else
            {
                isOpenDoor = false;
            }
        }
	}
}

将以上代码添加到car模型上,然后点击鼠标实现开门和关门的一个简单效果,效果截图:


鼠标左键点击车门:


2.旋转缩放:

//旋转
        if (Input.GetMouseButtonDown(0))
        {
            p1 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);//鼠标右键按下时记录鼠标位置p1
        }
        if (Input.GetMouseButton(0))
        {
            p2 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);//鼠标右键拖动时记录鼠标位置p2
            //下面开始旋转,仅在水平方向上进行旋转
            float dx = p2.x - p1.x;
            float dy = (float)0.1*(p2.y - p1.y);
            transform.RotateAround(car.transform.position, Vector3.up, dx * Time.deltaTime);
            //鼠标上下移动
            //transform.Translate(dy*Vector3.up * Time.deltaTime);
            light.transform.RotateAround(car.transform.position, Vector3.up, dx*Time.deltaTime);
        }


        //鼠标滚轮控制场景大小
        // 如果按住滑轮
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            Debug.Log(1);
            Debug.Log(Input.GetAxis("Mouse ScrollWheel"));
           
            if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
            {
                normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;
            }

            if (normalDistance < MouseZoomMin)
            {
                normalDistance = MouseZoomMin;
            }
            if (normalDistance > MouseZoomMax)
            {
                normalDistance = MouseZoomMax;
            }
      
            transform.camera.fieldOfView = normalDistance;

            
        }

        //后滚
        else if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            Debug.Log(-1);
            if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
            {
                normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;
            }

            if (normalDistance < MouseZoomMin)
            {
                normalDistance = MouseZoomMin;
            }
            if (normalDistance > MouseZoomMax)
            {
                normalDistance = MouseZoomMax;
            }
           // transform.Translate(-transform.forward * normalDistance);
            transform.camera.fieldOfView = normalDistance;
        }
效果图:


关于Unity3D,我们有个专门技术讨论的大群,可以进行技术交流和咨询,群号:858550 欢迎进行技术讨论,里面有不少大牛

相关文章
|
存储
飞机大战-飞机爆炸(8)
编写飞机大战,完成飞机爆炸功能。
81 0
|
6月前
|
Go 图形学
【Unity小技巧】3D人物移动脚步和跳跃下落音效控制
【Unity小技巧】3D人物移动脚步和跳跃下落音效控制
61 1
|
6月前
|
图形学
【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果
【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果
54 0
|
6月前
|
图形学 开发者
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
251 0
|
6月前
|
定位技术 图形学
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
148 0
|
7月前
都市天际线(游戏无法打开画面解决方案总结)
都市天际线(游戏无法打开画面解决方案总结)
168 0
|
Python
飞机大战-显示我方飞机
用Python进行编写飞机大战,显示我方飞机。
63 0
飞机大战-我方飞机移动基于事件
飞机大战-我方飞机移动基于事件。
64 0
【unity2D横板】【sunnyland】敌人巡逻追击主角以及返回原点
【unity2D横板】【sunnyland】敌人巡逻追击主角以及返回原点
|
人工智能 监控 搜索推荐
电视机的音响会旋转开机仪式带来的动感交互
“会动”,是近半年来智能家电研发的一个新方向,有一些新产品增加了“开机仪式”,给用户非常新颖的感觉。
197 0
电视机的音响会旋转开机仪式带来的动感交互