bool CheckHit(Vector3 dir, float deltaMove) { Vector3 org_pos = transform.position; org_pos -= (dir * (m_radius * 1.2f)); //org_pos.y = m_owner_y; RaycastHit[] hits = Physics.SphereCastAll(org_pos, m_radius, dir, deltaMove + 0.2f + m_radius, m_layerMask); if (hits != null) { for (int i = 0; i < hits.Length; i++) { RaycastHit hit = hits[i]; GameObject target = hit.transform.gameObject; bool is_valid_hit = false; int id = target.GetInstanceID(); if (m_hitObjSet.ContainsKey(id) == false) { m_hitObjSet.Add(id, target); //Log.Error("arrow hit"); m_attacker.OnComputeHit(target, m_hitNode); } if (is_valid_hit) { return(true); } } } return(false); }
public override void Play(ISkillAttacker attacker, SkillEffect se) { //player.animation.CrossFade(name, 0.2); //通知释法者,计算伤害 //Debug.Log("OnComputeDamage hit "); //caster.SendMessage("OnComputeDamage", id, SendMessageOptions.DontRequireReceiver); //skill_id = attacker.GetCurSkillId(); skill_id = se.CurSkillID; m_uDamageID = attacker.GetDamageID(); attacker.OnComputeHit(this); }
// Update is called once per frame void Update() { m_onceTime += Time.deltaTime; if (Time.time - m_onceTime > m_deltaTime) { m_hitIndex++; m_onceTime = 0.0f; m_attacker.OnComputeHit(m_hitNode); } if (m_hitIndex >= m_hitTimes) { GameObject.Destroy(gameObject); } }
void Update() { if (!bStart) { return; } if (bDestory) { return; } if (Time.time - m_startTime > m_len) { //超过最长时间 DestroyFx(); return; } if (m_targetObj != null) { if (m_attacker == null) { DestroyFx(); return; } //目标已经死亡 if (m_attacker.IsLive() == false) { DestroyFx(); return; } } Vector3 targetPos = m_attacker.GetTargetHitNodePos(m_SkillTarget, targetHitNode); if (targetPos == Vector3.zero) { targetPos = castPos; // Log.Error("use cast pos"); } else { float dis = GetVectorDistance(transform.position, targetPos); totalTime -= Time.deltaTime; if (totalTime >= 0) { m_speed = dis / totalTime; } else { DestroyFx(); return; } } // m_speed += m_acce * Time.deltaTime; float deltaMove = m_speed * Time.deltaTime; // Log.Error("speed is " + m_speed + " delta move is " + deltaMove); if (m_targetObj != null) { Vector3 dist = targetPos - transform.position; Vector3 dir = dist.normalized; transform.LookAt(targetPos); float distance = GetVectorDistance(targetPos, transform.position); // if (distance <= deltaMove * deltaMove) if (distance <= 0.2f) { //击中目标, if (m_attacker != null) { // m_hitNode.m_uDamageID = m_attacker.GetDamageID(); //Log.Error("follow hit"); m_attacker.OnComputeHit(m_targetObj, m_hitNode); DestroyFx(); return; } //已经到达 transform.position = targetPos; } else { transform.position += dir * deltaMove; } // Log.Error("dir is " + dir + " pos is " + transform.position+" targetpos is "+targetPos); } else { DestroyFx(); //transform.position += transform.forward * deltaMove; } }