[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)
编写飞机大战,完成飞机爆炸功能。
76 0
|
5月前
|
Go 图形学
【Unity小技巧】3D人物移动脚步和跳跃下落音效控制
【Unity小技巧】3D人物移动脚步和跳跃下落音效控制
53 1
|
5月前
|
图形学
【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果
【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果
49 0
|
5月前
|
图形学 开发者
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
215 0
|
5月前
|
定位技术 图形学
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
126 0
|
5月前
|
前端开发 C语言 C++
每周一坑--打飞机游戏
每周一坑--打飞机游戏
|
6月前
都市天际线(游戏无法打开画面解决方案总结)
都市天际线(游戏无法打开画面解决方案总结)
158 0
【unity2D横板】【sunnyland】敌人巡逻追击主角以及返回原点
【unity2D横板】【sunnyland】敌人巡逻追击主角以及返回原点
|
存储 JavaScript
拖动水滴给土地浇水(CocosCreator)
拖动水滴给土地浇水(CocosCreator)
拖动水滴给土地浇水(CocosCreator)
|
数据可视化 前端开发 小程序
中秋节——我给心爱的她做了一个3d月球动画
前言 大家好,又到了周末了,又到了Fly写文章的时候了, 过几天不是中秋节了,想着之前写过一篇从0- 1 实现3D地球的,反响效果特别好, 这次趁着🎑节给大家写了一个月球绕地球的运转的动画。本篇文章还是偏入门级别,重在把简单的知识讲清楚,如果是资深three爱好者,可以直接划走了,不浪费大家时间。ok👌言归正传,读完本篇文章你可以学到什么?至于心爱的她—— 就是学习 本文阅读估计花费 5 分钟 天空盒子的制作 three.js 中的贴图 一个物体绕另一个物体旋转 初始化 这篇文章我不会在从头详细的介绍three.js 的一些要素了,如果小伙伴你不是很清楚的话,你可以直接看下我这篇文章入
中秋节——我给心爱的她做了一个3d月球动画