游戏人物头顶的buff制作
直接上干货,第一个脚本负责生成buff并挂载到英雄头顶。
public class ShowBuff : MonoBehaviour {
public GameObject target;
float characterControllerHeight;
Transform targetTransform;
Renderer targetRenderer;
Vector3 targetPosition;
void Awake()
{
this.transform.SetParent(GameObject.Find("BloodshowPanel").GetComponent<Transform>(), false);
SetTarget(target);
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
// Destroy itself if the target is null, It's a fail safe when Photon is destroying Instances of a Player over the network
if (target == null)
{
Destroy(this.gameObject);
return;
}
}
public void SetTarget(GameObject _target)
{
if (_target == null)
{
// Debug.LogError("<Color=Red><b>Missing</b></Color> PlayMakerManager target for PlayerUI.SetTarget.", this);
return;
}
// Cache references for efficiency because we are going to reuse them.
this.target = _target;
targetTransform = this.target.GetComponent<Transform>();
targetRenderer = this.target.GetComponent<Renderer>();
CharacterController _characterController = this.target.GetComponent<CharacterController>();
if (_characterController != null)
{
//characterControllerHeight = _characterController.height;
characterControllerHeight = this.target.GetComponent<MeshFilter>().mesh.bounds.size.y;
}
}
void LateUpdate()
{
// Do not show the UI if we are not visible to the camera, thus avoid potential bugs with seeing the UI, but not the player itself.
if (targetRenderer != null)
{
this.gameObject.SetActive(targetRenderer.isVisible);
}
// #Critical
// Follow the Target GameObject on screen.
if (targetTransform != null)
{
targetPosition = targetTransform.position;
targetPosition.y += 1.8f;
this.transform.position = Camera.main.WorldToScreenPoint(targetPosition) + new Vector3(0, 30, 0);
}
}
}
第二个脚本放在图片的预制件上。负责播放buff帧动画。
public class InitISprites : MonoBehaviour {
public Sprite[] loadingTextures;//异步加载时实现帧动画的图片组
public Image loadingImage;//切换场景时图片载体
public float cele_rate = 1;
float curTexture = 0;//用于帧动画的图片
int curIndex = 0;//当前索引值
void Start () {
}
void Update () {
ChangeTexture();//改变帧动画图片的方法
}
void ChangeTexture()
{//切换场景帧动画的实现
if (!loadingImage.gameObject.activeInHierarchy) return;//如果当前的图片载体没有被禁用
curTexture += Time.deltaTime * 8* cele_rate;//当前图片浮点型索引值增加
curIndex = (int)curTexture;//当前图片索引值
loadingImage.sprite = loadingTextures[curIndex % 7];//切换图片
}
}
第三个调用buff
private IEnumerator Celebrate_rocket(float v)
{
GameObject sele_prefab = (GameObject)Resources.Load(“effects/Cele_rocket”);
sele_prefab = Instantiate(sele_prefab);
sele_prefab.SendMessage(“SetTarget”, this.gameObject, SendMessageOptions.RequireReceiver);
yield return new WaitForSeconds(5);
Destroy(sele_prefab, 0.1f);
}