UNITY实现上车与下车效果

2017-06-07  本文已影响0人  观南屏听晚钟

前些日子,做了一个项目,在上车下车的问题上困扰了很久,因为上车之后,要将游戏人物设为非激活,而要下车的时候根本无法实现。后来想了一个办法,引入了一个int值,当进行上下车操作的时候,将int值进行修改,然后根据int值进行上车和下车的操作。
首先,为坦克设置碰撞体检测,并对坦克的相应的动画进行设置
代码如下:
public class TankTrigger : MonoBehaviour
{

//玩家
private GameObject player;

//坦克移动脚本
private TankMove tankMove;
//坦克旋转脚本
private TankRotate tankRotate;
//坦克开火脚本
private TankFire tankFire;
//bool值,当前操作的是否为坦克
private bool isTank = false;
//int值
int a = 0;
//在坦克上的摄像机
private GameObject tankCamera;
//进入坦克的时候的过渡画面
private Image panel;
//离开坦克的时候的过渡动画
private Image downPanel;
//float值
private float alpha;
private float beta;

void Awake()
{
    player = GameObject.FindWithTag("Player");
    tankMove = transform.GetComponentInChildren<TankMove>();
    tankRotate = transform.GetComponentInChildren<TankRotate>();
    tankFire = transform.GetComponentInChildren<TankFire>();
    panel = GameObject.FindWithTag("Panel").GetComponent<Image>();
    downPanel = GameObject.FindWithTag("DownPanel").GetComponent<Image>();
    //关闭坦克组件
    transform.GetChild(0).GetChild(0).GetChild(0).gameObject.SetActive(false);
    tankRotate.enabled = false;
    tankMove.enabled = false;
    tankFire.enabled = false;
}

void Update()
{
    //按下F键,int值加一,当int值能够整除2的时候进行下车操作,不能被2整除的时候                          自然进行上车操作
    if (Input.GetKeyDown(KeyCode.F))
    {
        a++;
      
    }
    if (Input.GetKeyDown(KeyCode.F)&& a %2==0)
    {
        Down();
    }

}

///上车
void OnTriggerStay(Collider other)
{
   //两个float值用于设置过渡画面的渐变效果
    alpha += 0.01f;
    beta -= 0.01f;
    if (!isTank)
    {
        if (other.CompareTag("Player"))
        {
            if (Input.GetKeyDown(KeyCode.F))
            {
               //渐变上车动画,隐藏人物,开启坦克摄像机,并开启所有有关Tank的脚本
                panel.color = new Color(255, 255, 255, alpha);
                player.transform.SetParent(transform);
                player.SetActive(false);
                transform.GetChild(0).GetChild(0).GetChild(0).gameObject.SetActive(true);
                tankMove.enabled = true;
                tankRotate.enabled = true;
                tankFire.enabled = true;
                isTank = true;
               //协程,一段时间之后过渡画面消失
                StartCoroutine(PanelA());
            }
        }
    }
}

IEnumerator PanelA()
{
    yield return new WaitForSeconds(1);
    panel.color = new Color(255, 255, 255, beta);
}

//下车
void Down()
{
    alpha += 0.01f;
    beta -= 0.01f;
    if (isTank == true)
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            //渐变下车动画,设置人物位置,开启人物摄像机,并关闭所有有关Tank的脚本
            downPanel.color = new Color(255, 255, 255, alpha);
            transform.GetChild(0).GetChild(0).GetChild(0).gameObject.SetActive(false);
            player.SetActive(true);
           //使人物出现在坦克的附近
            player.transform.position = transform.GetChild(0).GetChild(1).position+ new Vector3(1.5f, 0, 0);
            player.transform.SetParent(transform.parent.parent);
            tankMove.enabled = false;
            tankRotate.enabled = false;
            tankFire.enabled = false;
            isTank = false;
            StartCoroutine(PanelB());
        }
    }
}

IEnumerator PanelB()
{
    yield return new WaitForSeconds(1);
    downPanel.color = new Color(255, 255, 255, beta);
}

}

上一篇下一篇

猜你喜欢

热点阅读