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

相关文章
|
6月前
|
存储 算法 开发者
黑神话:悟空中的动态光照与阴影效果
【8月更文第26天】在《黑神话:悟空》这款游戏中,高质量的光照和阴影效果对于营造出逼真的游戏环境至关重要。为了达到这种效果,游戏开发团队采用了先进的实时渲染技术,包括动态光照和阴影技术。本文将详细介绍这些技术如何被用来增强场景的真实感。
180 3
|
8月前
|
图形学
【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果
【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果
82 0
|
8月前
|
定位技术 图形学
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)
254 0
|
定位技术 图形学
Unity3D——射击游戏(多地图,多人物,枪支切换,驾车,扔手雷等功能,堪比小型和平精英)
Unity3D——射击游戏(多地图,多人物,枪支切换,驾车,扔手雷等功能,堪比小型和平精英)
|
9月前
都市天际线(游戏无法打开画面解决方案总结)
都市天际线(游戏无法打开画面解决方案总结)
225 0
|
存储 JavaScript
拖动水滴给土地浇水(CocosCreator)
拖动水滴给土地浇水(CocosCreator)
拖动水滴给土地浇水(CocosCreator)
Threejs实现开门关门动画
Threejs实现开门关门动画
743 0
|
弹性计算 Python
有风,你就能在空中飞翔
新时代有了许多机会,给还在校园的学生提供便利,恰好你有在空中飞翔的愿望,这里有风。
|
人工智能 监控 搜索推荐
电视机的音响会旋转开机仪式带来的动感交互
“会动”,是近半年来智能家电研发的一个新方向,有一些新产品增加了“开机仪式”,给用户非常新颖的感觉。
211 0
电视机的音响会旋转开机仪式带来的动感交互
试飞成功的“龙”飞船即将返回地球,计划于7月进行真人飞行
据多方消息,7月的这一载人发射任务还有一些不确定性。
161 0

热门文章

最新文章