[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 欢迎进行技术讨论,里面有不少大牛

相关文章
|
4月前
|
容器
如何在射击游戏中实现双摇杆控制?
如何在射击游戏中实现双摇杆控制?
48 0
|
3月前
都市天际线(游戏无法打开画面解决方案总结)
都市天际线(游戏无法打开画面解决方案总结)
88 0
|
6月前
|
搜索推荐 图形学
透明度和透明贴图制作玻璃水杯
模型透明度是控制整个模型的透明度属性,而透明贴图是一种贴图技术,用于控制模型表面每个像素的透明度级别。透明贴图可以与模型的透明度属性结合使用,以实现更复杂和精细的透明效果。通过调整透明贴图的透明度通道,可以实现模型表面不同部分的个性化透明度设置。
105 0
Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向
Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向
944 0
Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向
Threejs实现卫星太阳板折叠动画,信号发射,姿态调整
Threejs实现卫星太阳板折叠动画,信号发射,姿态调整
250 0
Threejs实现卫星太阳板折叠动画,信号发射,姿态调整
【UE4系列】3dsMax,制作汽车骨骼+蒙皮
1,【打开模型】 使用3ds Max 打开模型 2,【解组】 打开模型之后,全选模型,进行解组 解组成功,如下图 3,【删除文件】 解组成功之后,把子文件夹全都选中,拖到一级目录,并删除红色框里所有的文件 4,【修改命名】 根据汽车零件部位,修改命名 4.1 改为Body 4.2 前右轮修改名称 为FR_Wheel (Front Right),名字也可以其他,修改为比较容易辨识就可以 4.3......
204 0
【UE4系列】3dsMax,制作汽车骨骼+蒙皮
|
人工智能 监控 搜索推荐
电视机的音响会旋转开机仪式带来的动感交互
“会动”,是近半年来智能家电研发的一个新方向,有一些新产品增加了“开机仪式”,给用户非常新颖的感觉。
161 0
电视机的音响会旋转开机仪式带来的动感交互
三星环绕屏专利曝光,柔性屏幕的顶点
近些年来,手机圈一直为全面屏的最终形态争论不休,之前有人认为弹出摄像头设计算是最接近真全面屏的设计,但因为机身厚度问题现在也被束之高阁了。现在也有屏下摄像头的手机上市,不过距离普及还很遥远。
129 0
三星环绕屏专利曝光,柔性屏幕的顶点
iPhone XI再度被曝光,或采用新技术“黑色镜头涂层”
iPhone XI将配备5.8英寸OLED屏幕,后置摄像头将升级为三摄。
565 0

热门文章

最新文章