做到汽车的开关门,原本我是用代码进行控制,在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);
}
}
}