做到汽车的开关门,原本我是用代码进行控制,在update函数中只要让他旋转到一定的角度就OK了,但后来发现这样实现的效果并不好,所以就决定用动画来实现开关门的效果。

操作步骤:

1.Project->Add Tab->Animation 来创建动画,然后来创建帧动画。

2.创建完毕之后,可以给关门的最后一帧添加一个事件,但必须确保事件的函数脚本跟动画附着在同一个物体上,然后双击事件指定事件函数。

说明:由于开门关门就是一个重复的相反的动画,所以开门和关门就做了一个动画-开门的动画,关门只需要倒播就行了。

代码:

播放关门声音


using UnityEngine;
using System.Collections;

public class playMusic : MonoBehaviour {
    public AudioClip music = null;
    private GameObject camera;

    public float musicVolume = 0.6f;
    private AudioSource music_A = null;


	// Use this for initialization
	void Start () {
        //music = GameObject.Find("closedoor1");
        camera = GameObject.Find("Main Camera");
        music_A = camera.AddComponent<AudioSource>();
        //添加声音		
        music_A.clip = music;
        music_A.volume = musicVolume;
	}
	
	// Update is called once per frame
	void Update () {
	
	}


    int i = 0;
    void PlayMusic()
    {
        if (i != 0)
        {
            music_A.Play();
        }
        i++;
        i = i % 2;
    }
}



开门脚本:


using UnityEngine;
using System.Collections;

public class opendoor : MonoBehaviour {
    public GameObject camera;
	//左门
    //private bool isOpenDoor1 = false;
    //private bool openDoor1 = false;
    //private bool closeDoor1 = false;
    右门
    //private bool isOpenDoor2 = false;
    //private bool openDoor2 = false;
    //private bool closeDoor2 = false;
    左后门
    //private bool isOpenDoor3 = false;
    //private bool openDoor3 = false;
    //private bool closeDoor3 = false;
    右后门
    //private bool isOpenDoor4 = false;
    //private bool openDoor4 = false;
    //private bool closeDoor4 = false;
	/*
	//前盖
	private bool isOpenDoor3 = false;
    private bool openDoor3 = false;
    private bool closeDoor3 = false;
	//后盖
	private bool isOpenDoor4 = false;
    private bool openDoor4 = false;
    private bool closeDoor4 = false;
	*/
	
    private int target1 = 0;
	private int target2 = 0;
	private int target3 = 0;
	private int target4 = 0;
    int flag1 = 0;
	int flag2 = 0;
	int flag3 = 0;
	int flag4 = 0;
    Ray ray;
    RaycastHit hitobj;
    private GameObject door; //左门
	private GameObject door2; //右门
	private GameObject door3; //左后门
	private GameObject door4; //右后门

    float animSpeed = 0.5f;
	
	/*
	private GameObject frontGate; //前盖子
	private GameObject behindGate; //后盖子
	*/
	
	// Use this for initialization
	void Start () {
        camera = GameObject.Find("Main Camera");
		/*
        doorl = GameObject.Find("doorL");//左门
		door2 = GameObject.Find("doorR");//右门
        frontGate = GameObject.Find("frontGate");//前盖
		behindGate = GameObject.Find("behindGate");//后盖
		*/
		door = GameObject.Find("doorL1"); //左前门
		door.AddComponent<BoxCollider>();
		door2 = GameObject.Find("doorR1"); //右前门
		door2.AddComponent<BoxCollider>();
		door3 = GameObject.Find("doorL2"); //左后门
		door3.AddComponent<BoxCollider>();
		door4 = GameObject.Find("doorR2"); //右后门
		door4.AddComponent<BoxCollider>();
		//camera = GameObject.Find("MainCamera");
		
        添加声音		
        //music_A = camera.AddComponent<AudioSource>();
        //music_A.clip = music;
        //music_A.volume = musicVolume;
	}

    //public AudioClip music = null;
    //public float musicVolume = 0.6f;
    //private AudioSource music_A = null;
	
    float n = 0.06f;
    int t = 0;
	// Update is called once per frame
    void Update()
    {

        move();
        //画出射线
        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 == "doorL1")
                {
                    print("111");
                    //开门
                    if (flag1 == 0)
                    {
                        print("anim");
                        door.animation["doorFL"].speed = animSpeed * 1.0f;
                        door.animation.Play("doorFL");
                        //openDoor1 = true;
                        //closeDoor1 = false;
                    }
                    else
                    {
                        if (!door.animation.isPlaying)
                        {
                            door.animation["doorFL"].time = door.animation["doorFL"].length;
                            door.animation["doorFL"].speed = -1.0f * animSpeed;
                            door.animation.Play("doorFL");
                        }
                        else
                        {
                            door.animation["doorFL"].speed = -1.0f * animSpeed;
                            door.animation.Play("doorFL");
                        }
                        //music_A.Play();
                        //if (!door.animation.isPlaying)
                        //{
                        //    print("music");
                        //    music_A.Play();
                        //}
                        //StartCoroutine(closeDoorVoice());
                        //closeDoor1 = true;
                        //openDoor1 = false;
                    }

                    flag1++;
                    flag1 %= 2;
                }
                //右车门
                if (hitobj.collider.name == "doorR1")
                {
                    print(222);
                    if (flag2 == 0)
                    {
                        door2.animation["doorFR"].speed = animSpeed * 1.0f;
                        door2.animation.Play("doorFR");
                        //openDoor2 = true;
                        //closeDoor2 = false;
                    }
                    else
                    {
                        if (!door2.animation.isPlaying)
                        {
                            door2.animation["doorFR"].time = door2.animation["doorFR"].length;
                            door2.animation["doorFR"].speed = -1.0f * animSpeed;
                            door2.animation.Play("doorFR");
                        }
                        else
                        {
                            door2.animation["doorFR"].speed = -1.0f * animSpeed;
                            door2.animation.Play("doorFR");
                        }
                        //closeDoor2 = true;
                        //openDoor2 = false;
                    }

                    flag2++;
                    flag2 %= 2;
                }
                //左后车门
                if (hitobj.collider.name == "doorL2")
                {
                    print(222);
                    if (flag3 == 0)
                    {
                        door3.animation["doorBL"].speed = animSpeed * 1.0f;
                        door3.animation.Play("doorBL");
                        //openDoor3 = true;
                        //closeDoor3 = false;
                    }
                    else
                    {
                        if (!door3.animation.isPlaying)
                        {
                            door3.animation["doorBL"].time = door3.animation["doorBL"].length;
                            door3.animation["doorBL"].speed = -1.0f * animSpeed;
                            door3.animation.Play("doorBL");
                        }
                        else
                        {
                            door3.animation["doorBL"].speed = -1.0f * animSpeed;
                            door3.animation.Play("doorBL");
                        }
                        //closeDoor3 = true;
                        //openDoor3 = false;
                    }

                    flag3++;
                    flag3 %= 2;
                }
                //右车门
                if (hitobj.collider.name == "doorR2")
                {
                    print(222);
                    if (flag4 == 0)
                    {
                        door4.animation["doorBR"].speed = animSpeed * 1.0f;
                        door4.animation.Play("doorBR");
                        //openDoor4 = true;
                        //closeDoor4 = false;
                    }
                    else
                    {
                        if (!door4.animation.isPlaying)
                        {
                            door4.animation["doorBR"].time = door4.animation["doorBR"].length;
                            door4.animation["doorBR"].speed = -1.0f * animSpeed;
                            door4.animation.Play("doorBR");
                        }
                        else
                        {
                            door4.animation["doorBR"].speed = -1.0f * animSpeed;
                            door4.animation.Play("doorBR");
                        }
                        //closeDoor4 = true;
                        //openDoor4 = false;
                    }

                    flag4++;
                    flag4 %= 2;
                }
            }
        }


                //if (openDoor1)
                //{
                //    print(11);
                //    //开门
                //    if (target1 < 45 && !isOpenDoor1)
                //    {
                //        door.transform.Rotate(Vector3.forward, 1);
                //        target1 = target1 + 1;
                //    }
                //    else
                //    {
                //        // move();
                //        isOpenDoor1 = true;
                //        music_A.Play();
                //    }
                //}
                //if (closeDoor1)
                //{
                //    print(00);
                //    //关门
                //    if (isOpenDoor1 && target1 > 0)
                //    {
                //        door.transform.Rotate(-Vector3.forward, 1);
                //        target1 -= 1;
                //    }
                //    else
                //    {
                //        //music_A.Play();
                //        isOpenDoor1 = false;
                //    }
                //}
                //开右门
                //if (openDoor2)
                //{
                //    print(11);
                //    //开门
                //    if (target2 < 45 && !isOpenDoor2)
                //    {
                //        door2.transform.Rotate(Vector3.forward, 1);
                //        target2 = target2 + 1;
                //    }
                //    else
                //    {
                //        // move();
                //        isOpenDoor2 = true;
                //        music_A.Play();
                //    }
                //}
                //if (closeDoor2)
                //{
                //    //关门
                //    if (isOpenDoor2 && target2 > 0)
                //    {
                //        door2.transform.Rotate(-Vector3.forward, 1);
                //        target2 -= 1;
                //    }
                //    else
                //    {

                //        isOpenDoor2 = false;
                //    }
                //}
                开左后门
                //if (openDoor3)
                //{
                //    //开门
                //    if (target3 < 45 && !isOpenDoor3)
                //    {
                //        door3.transform.Rotate(Vector3.forward, 1);
                //        target3 = target3 + 1;
                //    }
                //    else
                //    {
                //        // move();
                //        isOpenDoor3 = true;
                //        music_A.Play();
                //    }
                //}
                //if (closeDoor3)
                //{
                //    //关门
                //    if (isOpenDoor3 && target3 > 0)
                //    {
                //        door3.transform.Rotate(-Vector3.forward, 1);
                //        target3 -= 1;
                //    }
                //    else
                //    {
                //        isOpenDoor3 = false;
                //    }
                //}
                开右门
                //if (openDoor4)
                //{
                //    //开门
                //    if (target4 < 45 && !isOpenDoor4)
                //    {
                //        door4.transform.Rotate(Vector3.forward, 1);
                //        target4 = target4 + 1;
                //    }
                //    else
                //    {
                //        // move();
                //        isOpenDoor4 = true;
                //        music_A.Play();
                //    }
                //}
                //if (closeDoor4)
                //{
                //    //关门
                //    if (isOpenDoor4 && target4 > 0)
                //    {
                //        door4.transform.Rotate(-Vector3.forward, 1);
                //        target4 -= 1;
                //    }
                //    else
                //    {
                //        isOpenDoor4 = false;
                //    }
                //}
    }

    //IEnumerator closeDoorVoice()
    //{
    //    yield return new WaitForSeconds(door.animation["doorFL"].time);
    //    //music_A.Play();
    //}

    //void changeSpeed(float target,GameObject obj,float n = 0.3f,int t = 0)
    //{
    //    doorl.transform.Rotate(Vector3.forward, n*(++t));
    //    target1 = 0.5*n*t*t;
    //}
    //界面的前后左右上下移动
    void move()
    {
        //前移
        if (Input.GetKey(KeyCode.W))
        {
            camera.transform.Translate(transform.forward);
        }
        //后移
        if (Input.GetKey(KeyCode.S))
        {
            camera.transform.Translate(-transform.forward);
        }
        //左移
        if (Input.GetKey(KeyCode.A))
        {
            camera.transform.Translate(-transform.right);
        }
        //右移
        if (Input.GetKey(KeyCode.D))
        {
            camera.transform.Translate(transform.right);
        }
        //上
        if (Input.GetKey(KeyCode.Q))
        {
            camera.transform.Translate(transform.up);
        }
        //下
        if (Input.GetKey(KeyCode.E))
        {
            camera.transform.Translate(-transform.up);
        }
		//调整仰视视角
		if(Input.GetKey(KeyCode.Z))
		{
			camera.transform.Rotate(Vector3.right);	
		}
		//调整俯视视角
		if(Input.GetKey(KeyCode.C))
		{
			camera.transform.Rotate(-Vector3.right);	
		}
    }
}