前些日子,做了一个项目,在上车下车的问题上困扰了很久,因为上车之后,要将游戏人物设为非激活,而要下车的时候根本无法实现。后来想了一个办法,引入了一个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);
}
}