public void BreakAtPoint(Vector3 pos, Texture2D stampTexture) { // pos -= offset; if (!stampTexture) { stampTexture = defaultStamp; } pos = transform.InverseTransformPoint(pos); float ws = 1f / (texture_A_XY.width / resolutionScale); // pos -= transform.position; pos *= ws; pos.x %= 1f; pos.y %= 1f; pos.z %= 1f; Vector2 xy = new Vector2(pos.x, pos.y); Vector2 yz = new Vector2(pos.y, pos.z); Vector2 xz = new Vector2(pos.x, pos.z); Mathaf.DrawTexture(xy, texture_A_XY, stampTexture); Mathaf.DrawTexture(yz, texture_B_YZ, stampTexture); Mathaf.DrawTexture(xz, texture_C_XZ, stampTexture); }
void Move_3D_UpdateKey() { v = KeyManagerHub.main.GetStickVel(false); Vector3 vv = v; v.x = vv.y; v.y = vv.x; v.x += v.x; v.y += v.y; rsVel = Vector3.Lerp(rsVel, v, Time.deltaTime * 60f); Vector3 e = Camera.main.transform.eulerAngles; e = Vector3.Lerp(e, e + (rsVel * speed), Time.deltaTime * 3f); e.x = Mathaf.NormalizeRad(e.x); if (e.x > 75f) { e.x = 75f; } if (e.x < -75f) { e.x = -75f; } Camera.main.transform.eulerAngles = e; }
public float GetStickRadFromCameraTarget(bool isLeft, Transform target = null) { if (!gameObject.activeSelf) { return(0f); } Vector3 vel = GetStickVel(isLeft); if (vel.magnitude <= 0f) { return(0f); } //スティックの入力角度 float StickCalRad = (Mathf.Atan2(-vel.x, vel.y) * 180 / Mathf.PI); float r = 0f; if (target) { r = (-StickCalRad + Camera.main.transform.eulerAngles.y) - target.eulerAngles.y; } else { r = -StickCalRad; } r = Mathaf.NormalizeRad(r); return(r); }
// Start is called before the first frame update void Start() { thisRenderer = GetComponent <Renderer>(); Material material = thisRenderer.material; offset = thisRenderer.bounds.min - thisRenderer.transform.position; Vector3 s = thisRenderer.bounds.size; float maxS = Mathf.Max(s.x, s.y, s.z); int reso = (int)(resolutionScale * maxS); //テクスチャのコピーを作成(みんなで一つのテクスチャを共有するとだめ) texture_A_XY = Mathaf.textureCreateInit(material, "BreakMask_XY", reso, reso, TextureWrapMode.Clamp); texture_B_YZ = Mathaf.textureCreateInit(material, "BreakMask_YZ", reso, reso, TextureWrapMode.Clamp); texture_C_XZ = Mathaf.textureCreateInit(material, "BreakMask_XZ", reso, reso, TextureWrapMode.Clamp); // wSize = thisRenderer.material.GetVector("Scale"); material.SetTexture("BreakMask_XY", texture_A_XY); material.SetTexture("BreakMask_YZ", texture_B_YZ); material.SetTexture("BreakMask_XZ", texture_C_XZ); material.SetFloat("ResolutionScale", resolutionScale); }
/// <summary> /// Yを軸とした、前回と今回の回転差分を取得する /// </summary> /// <param name="prevForward"></param> /// <param name="currentForward"></param> /// <returns></returns> float FromToRadianOffsetAxis(Vector3 prevForward, Vector3 currentForward) { //前回フレームと今回フレームのY軸回転の差異のぶんだけ、アバターを回転させる Vector3 prevF = prevForward; Vector3 currentF = currentForward; float prevMag = prevF.magnitude; float currentMag = currentF.magnitude; float prevRad = Mathaf.NormalizeRad((Mathf.Atan2(prevF.x, prevF.z) * 180 / Mathf.PI)); float currentRad = Mathaf.NormalizeRad((Mathf.Atan2(currentF.x, currentF.z) * 180 / Mathf.PI)); float rad = Mathaf.NormalizeRad(currentRad - prevRad); return(rad); }
/// <summary> /// 高精度版 /// </summary> /// <param name="mesh"></param> /// <param name="_poss"></param> /// <param name="density"></param> static public void MeshBuffToSurfacePoints(Mesh mesh, out List <Vector3> _poss /*, out List<Vector3> _nors, out List<Vector3> _uvs */, float density = 10f) { _poss = new List <Vector3>(); //_nors = new List<Vector3>(); //_uvs = new List<Vector3>(); var triangles = mesh.triangles; var vertices = mesh.vertices; //var normals = mesh.normals; //var uvs = mesh.uv; Debug.Log("Tri" + mesh.triangles.Length); for (var i = 0; i < triangles.Length; i += 3) { var v0 = triangles[i]; var v1 = triangles[i + 1]; var v2 = triangles[i + 2]; var pos_a = vertices[v0]; var pos_b = vertices[v1]; var pos_c = vertices[v2]; //var nor_a = normals[v0]; //var nor_b = normals[v1]; //var nor_c = normals[v2]; //var uv_a = uvs[v0]; //var uv_b = uvs[v1]; //var uv_c = uvs[v2]; var area = Mathaf.TriangleArea(pos_a, pos_b, pos_c); var areaDensity = Mathf.CeilToInt(area * density); for (var l = 0; l < areaDensity; l++) { var a_b = Random.Range(0f, 1f); var ab_c = Random.Range(0f, 1f); _poss.Add(SurfacePoint(pos_a, pos_b, pos_c, a_b, ab_c)); //_nors.Add(SurfacePoint(nor_a, nor_b, nor_c, a_b, ab_c)); //_uvs.Add(SurfacePoint(uv_a, uv_b, uv_c, a_b, ab_c)); } } }
// Use this for initialization void Start() { if (!main) { main = this; } defaSpeed = speed; gameObject.layer = LayerMask.NameToLayer("Camera"); rb = Camera.main.transform.GetComponent <Rigidbody>(); //CinemachineVirtualCamera CVC = Camera.main.GetComponent<CinemachineVirtualCamera>(); //CVC.LookAt = target; //CVC.Follow = camChild; //Camera.main.transform.parent = camChild; //Camera.main.transform.localPosition = Vector3.zero; //Camera.main.transform.localEulerAngles = Vector3.zero; defaZoom = Camera.main.fieldOfView; Animator animator = target.GetComponent <Animator>(); if (animator) { Transform HeadTrans = Mathaf.FindChildAll(animator.transform, "EdiBone_F"); if (HeadTrans) { target = HeadTrans; } // target = animator.GetBoneTransform(HumanBodyBones.Neck); transform.position = target.position; } // PPV = Camera.main.GetComponent<PostProcessVolume>(); // Camera.main.GetComponent<PostProcessVolume>().profile.TryGetSettings<Vignette>(out vignette); }
void Look(bool accelFlag) { // Quaternion toRad = Quaternion.LookRotation(/*targetPos - transform.position*/Camera.main.transform.forward); Quaternion toRad = Quaternion.LookRotation(CameraManager_Cinema.main.TargetPos - transform.position); if (accelFlag) { Vector3 radVel = toRad.eulerAngles - transform.eulerAngles; radVel = Mathaf.NormalizeRads(radVel); radVel = Vector3.Lerp(Vector3.zero, radVel, Time.deltaTime); rb.AddRelativeTorque(radVel, ForceMode.VelocityChange); } else { rb.angularVelocity = Vector3.zero; transform.rotation = Quaternion.Lerp(transform.rotation, toRad, Time.deltaTime * 10f); //ランダムに震える float r = 5f; rb.AddRelativeTorque(new Vector3(UnityEngine.Random.Range(-r, r), UnityEngine.Random.Range(-r, r), UnityEngine.Random.Range(-r, r)), ForceMode.VelocityChange); } }
void DefaultMode() { Vector3 upNormal = playerBall.Contacts.UpNormal_Ground; Vector3 tPos = targetPos; //float addSpeed = 0f; //rb.drag = Mathf.Lerp(rb.drag, defaultDrag, Time.deltaTime*10f); ////ジャンプ中は自分の足元にSDがくる //if (playerBall.isAerial && !stayFlag) //{ // tPos = targetPos - (Vector3.up*0.3f); // addSpeed = 75f; // rb.drag = 10f; //} //else //{ if (stayFlag) { tPos = stayPos; emitColor = Color.green; } else { //坂道判定で左右offset emitColor = Color.blue; tPos = Vector3.ClampMagnitude(transform.position - tPos, 1f) + tPos; float dot = Vector3.Dot(Camera.main.transform.right, upNormal); if (dot > 0.3f) { isLeftSide = true; } else if (dot < -0.3f) { isLeftSide = false; } else { //画面ポス判定で左右offset Vector3 mySPos = Camera.main.WorldToScreenPoint(transform.position); Vector3 parSPos = Camera.main.WorldToScreenPoint(targetPos); isLeftSide = (mySPos.x > parSPos.x); } tPos += Camera.main.transform.right * (isLeftSide ? 0.5f : -0.5f); tPos += (upNormal * 0.5f); } //} //プレイヤーと重ならないように補正 // tPos.y += Mathf.Clamp((2f - Vector3.Distance(transform.position, parent.transform.position)), 0f, 1f) * 1f; //射撃 //if(KeyManagerHub.main.GetKey(KeyMode.Enter , Key_Hub.R1)) //{ // Instantiate(bullet, transform.position, transform.rotation).Init(); // rb.AddForce(-transform.forward*3f, ForceMode.Impulse); //} //距離が離れすぎたらワープ float tDist = Vector3.Distance(tPos, transform.position); isWarping = tDist > 3f; //プレイヤーとカメラの間に入らないように補正 Vector3 playerToCameraPos = Mathaf.NearPosOnLine(transform.position, Camera.main.transform.position, targetPos); Vector3 ptpVel = transform.position - playerToCameraPos; rb.AddForce(ptpVel * Mathf.Clamp(2f - ptpVel.magnitude, 0f, 1f) * Time.deltaTime * 60f, ForceMode.VelocityChange); if (warpWeight >= 1f) { transform.position = tPos; } //加速移動 Vector3 vel = tPos - transform.position; vel = Vector3.ClampMagnitude(vel, 2f); vel = Vector3.Lerp(Vector3.zero, vel, Time.deltaTime); rb.AddForce(vel * (agi /*+addSpeed*/), ForceMode.VelocityChange); // Vector3 radVel = Quaternion.LookRotation(Camera.main.transform.forward).eulerAngles - transform.eulerAngles; Look(true); }
IEnumerator fixFunction() { yield return(new WaitForFixedUpdate()); //もしここに至るまでに接触判定の更新がなされていた場合、isPhysicsUpdateがtrueになっているはずだから、そしたらこっちの接触情報もアップデートする if (isPhysicsUpdate) { isGround_prev = isGround; isGround = false; //全ての接触情報から一番上向きの法線のものを取得 if (contactlList.Count > 0) { Vector3 normal = Vector3.down * float.MaxValue; upNormalContact = contactlList.OrderByDescending(b => b.normal.y).ToArray()[0]; //一番上向きの法線の上に立てるか否か判定 float d = Vector3.Dot(Vector3.up, upNormalContact.normal); isGround = d > tweak.groundUp; } else { //何にも接触していなければ、法線は上、設置フラグオフ upNormalContact = new ContactPoint(); isGround = false; } //if (IsMassOfMin) //{ // isGround = false; //} Vector3 lossScale = transform.lossyScale; Vector3 localScale = transform.localScale; transform.localScale = new Vector3( localScale.x / lossScale.x * defaultScale.x, localScale.y / lossScale.y * defaultScale.y, localScale.z / lossScale.z * defaultScale.z); rb.useGravity = true; //張り付き処理 rb.drag = minDrag; if (IsAnyContact) { // rb.useGravity = false; rb.drag = 1f; //地面が自分より重いか、地面のリジッドボディがキネマティックならば、その地面を自分の親とする if (IsMassOfMin || GetUpNormalRB().isKinematic) { transform.parent = upNormalContact.otherCollider.transform; Debug.DrawLine(transform.position, transform.parent.position, Color.magenta); } else { transform.parent = null; } ////現在ベクトルを表面に沿わせる //Vector3 v = Vector3.ProjectOnPlane(rb.velocity , upNormalContact.normal); //rb.velocity = v; float tweakTension = 50f; Vector3 surfaceVector = -upNormalContact.normal * tweakTension * Mathaf.deltaClampTime(Physics.gravity.magnitude); if (fitFlag) { //表面張力(自分張り付き判定用) rb.AddForceAtPosition(surfaceVector, contactPos); } if (ContactRBFlag) { //表面張力(親からの反発判定用) upNormalContact.otherCollider.attachedRigidbody.AddForceAtPosition(-surfaceVector, contactPos); //重みを加える upNormalContact.otherCollider.attachedRigidbody.AddForceAtPosition(Vector3.down * tweakTension * Mathaf.deltaClampTime(Physics.gravity.magnitude), contactPos); } else { } } else { transform.parent = null; } } }
// Update is called once per frame void Update() { animator.SetBool(anmID_RideOn, RideOnFlag); float toVel_X; float toVel_Z; if (RideOnFlag) { toVel_Z = Vector3.Dot(transform.forward, KeyManagerHub.main.GetStickVectorFromCamera(true)); toVel_X = Vector3.Dot(transform.right, KeyManagerHub.main.GetStickVectorFromCamera(true)); moveWeight += Time.deltaTime * 0.3f; //射撃 if (KeyManagerHub.main.GetKey(KeyMode.Enter, Key_Hub.R1)) { Bullet b = GameObject.Instantiate(TailGun_Bullet); b.transform.SetPositionAndRotation(TailGun.transform.position, Quaternion.LookRotation(aimPos - TailGun.transform.position)); b.Init(); recoilAccel = 0.1f; } } else { toVel_Z = 0f; toVel_X = 0f; moveWeight -= Time.deltaTime * 0.3f; } moveWeight = Mathf.Clamp(moveWeight, 0f, 1f); vel_Z = Mathf.Lerp(vel_Z, toVel_Z, moveAnimationSpeed); vel_X = Mathf.Lerp(vel_X, toVel_X, moveAnimationSpeed); Vector3 vel = new Vector3(vel_X, 0f, vel_Z); //animator.SetLayerWeight(1, vel.z * moveWeight); //animator.SetLayerWeight(2, vel.x * moveWeight); //リコイル減衰 recoil += recoilAccel; recoil = Mathf.Lerp(recoil, 0f, Time.deltaTime * 15f); if (recoil > 0f) { recoil -= Time.deltaTime * 10f; } recoilAccel = Mathf.Lerp(recoilAccel, 0f, Time.deltaTime * 15f); if (recoilAccel > 0f) { recoilAccel -= Time.deltaTime * 15f; } recoil = Mathf.Clamp(recoil, 0f, 1f); recoilAccel = Mathf.Clamp(recoilAccel, 0f, 1f); //尾Look Quaternion lookRad = Quaternion.identity; float dot = Vector3.Dot(Camera.main.transform.forward, transform.forward); dot *= 2f; dot = Mathf.Clamp(dot, 0f, 1f); float i = 0f; foreach (KeyValuePair <Transform, Quaternion> d in ikTales) { float w = i / (float)ikTales.Count; float revW = (ikTales.Count - i) / ikTales.Count; Transform t = d.Key; Quaternion prevRad = t.localRotation; lookRad = Quaternion.LookRotation(CameraManager_Cinema.main.TargetPos - TailGun.position); t.rotation = lookRad;//Quaternion.LookRotation(Camera.main.transform.forward , t.up); t.localRotation = Quaternion.Lerp(prevRad, Quaternion.Lerp(d.Value, t.localRotation, w * moveWeight * dot), Time.deltaTime * (5f + (w * 10f))); //リコイル Vector3 eRot = t.localEulerAngles; eRot.x -= revW * recoil * 100f * dot * moveWeight; t.localEulerAngles = eRot; i++; } //照準 //lr.SetPosition(0, TailGun.position); aimPos = Vector3.Lerp(TailGun.position + (TailGun.up * 100f), CameraManager_Cinema.main.TargetPos, dot); //lr.SetPosition(1, aimPos); //アニメ float radOfs = Mathaf.NormalizeRad(lookRad.eulerAngles.y - transform.eulerAngles.y) / 90f; animator.SetFloat(anmID_Rad, radOfs); animator.SetFloat(anmID_Vel_Z, vel.z); animator.SetFloat(anmID_Vel_X, vel.x); animator.SetFloat(anmID_Speed, Mathf.Clamp(vel.magnitude + Mathf.Abs(radOfs), 0f, 1f)); }
void Bump() { Vector3 aPos = targetRB.position; Vector3 bPos = Camera.main.transform.position; Ray ray = new Ray(aPos, bPos - aPos); float cameraPosDistanceFromA = Vector3.Distance(aPos, bPos); float radius = 0.05f; Vector3 nearNormal = Vector3.zero; bool hitFlag = false; RaycastHit hit = new RaycastHit(); foreach (RaycastHit h in Physics.SphereCastAll(ray, radius, cameraPosDistanceFromA, mask, QueryTriggerInteraction.Ignore)) { if (!hitFlag) { hitFlag = true; hit = h; } else { float aDistance = Vector3.Distance(hit.point, aPos); float bDistance = Vector3.Distance(h.point, aPos); if (aDistance > bDistance) { hit = h; } } } if (hitFlag) { Vector3 NearPos = Mathaf.NearPosOnLine(hit.point, aPos, bPos, false); float intrusion = (radius - Vector3.Distance(NearPos, hit.point)) / radius; nearNormal = (NearPos - hit.point).normalized * intrusion * radius; float nearPosDistanceFromA = Vector3.Distance(aPos, NearPos) - radius; float percentage = 1f - (nearPosDistanceFromA / (cameraPosDistanceFromA)); FPSWeight = percentage; Debug.DrawLine(aPos, aPos + Vector3.up, new Color(255f, 0f, 0f)); } else { FPSWeight -= Time.deltaTime; } FPSWeight = Mathf.Clamp(FPSWeight, 0f, 1f); if (aPos.y < 10.1f) { aPos.y = 10.1f; } Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, aPos, FPSWeight) + nearNormal; }
public void BreakAtRay(RaycastHit hit) { Mathaf.DrawTexture_Ray(texture_A_XY, hit, defaultStamp); }
void SetKey() { //ぼたん GetMyAxis("SANKAKU", ref enterSANKAKU, ref staySANKAKU, ref exitSANKAKU); GetMyAxis("MARU", ref enterMARU, ref stayMARU, ref exitMARU); GetMyAxis("BATU", ref enterBATU, ref stayBATU, ref exitBATU); GetMyAxis("SIKAKU", ref enterSIKAKU, ref staySIKAKU, ref exitSIKAKU); GetMyAxis("L3", ref enterL3, ref stayL3, ref exitL3); GetMyAxis("R3", ref enterR3, ref stayR3, ref exitR3); GetMyAxis("L2", ref enterL2, ref stayL2, ref exitL2); GetMyAxis("R2", ref enterR2, ref stayR2, ref exitR2); GetMyAxis("L1", ref enterL1, ref stayL1, ref exitL1); GetMyAxis("R1", ref enterR1, ref stayR1, ref exitR1); GetMyAxis("OPTION", ref enterOPTION, ref stayOPTION, ref exitOPTION); GetMyAxis("SHARE", ref enterSHARE, ref staySHARE, ref exitSHARE); GetMyAxis("PAD", ref enterPAD, ref stayPAD, ref exitPAD); GetMyAxis("PS", ref enterPS, ref stayPS, ref exitPS); //十時キー GetMyAxis("UorD", ref enterUP, ref stayUP, ref exitUP); GetMyAxisRev("UorD", ref enterDOWN, ref stayDOWN, ref exitDOWN); GetMyAxis("LorR", ref enterRIGHT, ref stayRIGHT, ref exitRIGHT); GetMyAxisRev("LorR", ref enterLEFT, ref stayLEFT, ref exitLEFT); //L2R2押し込み具合 float L2A = Input.GetAxis("L2Axis"); float R2A = Input.GetAxis("R2Axis"); if (L2A >= 1f && L2Axis < 1f) { enterL2Axis = true; } else { enterL2Axis = false; } if (R2A >= 1f && R2Axis < 1f) { enterR2Axis = true; } else { enterR2Axis = false; } L2Axis = L2A; R2Axis = R2A; //スティック左 //ローカルベクトル LStickVelLocal.z = Input.GetAxis("Vertical"); LStickVelLocal.x = Input.GetAxis("Horizontal"); //スティック入力パワー取得 float prevLSlickLen = LStickLen; enterLStick = false; enterLStickUp = false; enterLStickDown = false; enterLStickLeft = false; enterLStickRight = false; LStickLen = Vector2.Distance(new Vector2(0, 0), new Vector2(LStickVelLocal.x, LStickVelLocal.z)); if (LStickLen > 1.0f) { LStickLen = 1.0f; } if (LStickLen < 0.0f) { LStickLen = 0.0f; } else { //スティックの入力角度 float StickCalRad = (Mathf.Atan2(-LStickVelLocal.x, -LStickVelLocal.z) * 180 / Mathf.PI); //ワールド角度 LStickRadWorld = -StickCalRad + Camera.main.transform.eulerAngles.y; //ローカル角度 LStickRadLocal = -StickCalRad; } if (prevLSlickLen < 0.75f && LStickLen >= 0.75f) { enterLStick = true; if (LStickRadLocal < -90f + 45f && LStickRadLocal > -90f - 45f) { enterLStickLeft = true; } if (LStickRadLocal < 90f + 45f && LStickRadLocal > 90f - 45f) { enterLStickRight = true; } if (LStickRadLocal <= 45f && LStickRadLocal >= -45f) { enterLStickUp = true; } if (LStickRadLocal >= 90 + 45f || LStickRadLocal <= -90 - 45f) { enterLStickDown = true; } } LStickRadWorld = Mathaf.NormalizeRad(LStickRadWorld); LStickRadLocal = Mathaf.NormalizeRad(LStickRadLocal); //ワールドベクトル LStickVelWorld = Vector3.forward * LStickLen; LStickVelWorld = Quaternion.Euler(0, -LStickRadWorld, 0) * LStickVelWorld; //Rotate Cal float StickRadR = Input.GetAxis("RHorizontal"); float StickRadRV = Input.GetAxis("RVartical"); //スティック右 //ローカルベクトル RStickVelLocal.z = Input.GetAxis("RVartical"); RStickVelLocal.x = Input.GetAxis("RHorizontal"); //スティック入力パワー取得 float prevRSlickLen = RStickLen; enterRStick = false; enterRStickUp = false; enterRStickDown = false; enterRStickLeft = false; enterRStickRight = false; RStickLen = Vector2.Distance(new Vector2(0, 0), new Vector2(RStickVelLocal.x, RStickVelLocal.z)); if (RStickLen > 1.0f) { RStickLen = 1.0f; } if (RStickLen < 0.0f) { RStickLen = 0.0f; } else { //スティックの入力角度 float StickCalRad = (Mathf.Atan2(-RStickVelLocal.x, -RStickVelLocal.z) * 180 / Mathf.PI); //ワールド角度 RStickRadWorld = -StickCalRad + Camera.main.transform.eulerAngles.y; //ローカル角度 RStickRadLocal = -StickCalRad; } if (prevRSlickLen < 0.75f && RStickLen >= 0.75f) { enterRStick = true; if (RStickRadLocal < -90f + 45f && RStickRadLocal > -90f - 45f) { enterRStickLeft = true; } if (RStickRadLocal < 90f + 45f && RStickRadLocal > 90f - 45f) { enterRStickRight = true; } if (RStickRadLocal <= 45f && RStickRadLocal >= -45f) { enterRStickUp = true; } if (RStickRadLocal >= 90 + 45f || RStickRadLocal <= -90 - 45f) { enterRStickDown = true; } } RStickRadWorld = Mathaf.NormalizeRad(RStickRadWorld); RStickRadLocal = Mathaf.NormalizeRad(RStickRadLocal); //ワールドベクトル RStickVelWorld = Vector3.forward * RStickLen; RStickVelWorld = Quaternion.Euler(0, -RStickRadWorld, 0) * RStickVelWorld; }
/// <summary> /// ClothCollider自動で設定する /// </summary> /// <param name="cloth"></param> /// <returns></returns> void SetAutoClothCollider(GameObject obj) { List <Collider> colliders = new List <Collider>(); List <ClothSphereColliderPair> sphereColliders = new List <ClothSphereColliderPair>(); List <Cloth> cloths = new List <Cloth>(); cloths.AddRange(obj.GetComponentsInChildren <Cloth>()); //スフィアコライダアタッチ Transform rootSpine = Mathaf.FindChildAll(obj.transform, "tweak_spine"); SphereCollider hipL = rootSpine.gameObject.AddComponent <SphereCollider>(); SphereCollider hipR = rootSpine.gameObject.AddComponent <SphereCollider>(); SphereCollider shinL = Mathaf.FindChildAll(obj.transform, "shin_tweak.L").gameObject.AddComponent <SphereCollider>(); SphereCollider shinR = Mathaf.FindChildAll(obj.transform, "shin_tweak.R").gameObject.AddComponent <SphereCollider>(); //サイズ補正 hipL.radius = 0.1f; hipR.radius = 0.1f; shinL.radius = 0.1f; shinR.radius = 0.1f; //座標補正 hipL.center = new Vector3(0.1f, 0f, 0f); hipR.center = new Vector3(-0.1f, 0f, 0f); shinL.center = new Vector3(0f, 0f, 0f); shinR.center = new Vector3(0f, 0f, 0f); //ペア作成 //尻とひざ sphereColliders.Add(new ClothSphereColliderPair(hipL, shinL)); sphereColliders.Add(new ClothSphereColliderPair(hipR, shinR)); //右尻左尻 sphereColliders.Add(new ClothSphereColliderPair(hipL, hipR)); //コライダをリストに追加する colliders.Add(hipL); colliders.Add(hipR); colliders.Add(shinL); colliders.Add(shinR); //接触判定を消す foreach (SphereCollider sc in colliders) { sc.isTrigger = true; } //バッファ設定 foreach (Cloth c in cloths) { c.sphereColliders = sphereColliders.ToArray(); c.transform.parent = rootSpine.transform; } }
IEnumerator fixFunction() { yield return(new WaitForFixedUpdate()); //もしここに至るまでに接触判定の更新がなされていた場合、isPhysicsUpdateがtrueになっているはずだから、そしたらこっちの接触情報もアップデートする if (isPhysicsUpdate) { isGround_prev = isGround; //全ての接触情報から一番上向きの法線のものを取得 if (contactlList.Count > 0) { Vector3 normal = Vector3.down * float.MaxValue; foreach (ContactPoint c in contactlList) { if (c.normal.y > normal.y) { normal = c.normal; upNormalContact = c; } } //一番上向きの法線の上に立てるか否か判定 Vector3 un = UpNormal; float d = Vector3.Dot(Vector3.up, un); isGround = d > tweak.groundUp; } else { //何にも接触していなければ、法線は上、設置フラグオフ upNormalContact = new ContactPoint(); isGround = false; } if (IsMassOfMin) { isGround = false; } transform.parent = null; transform.localScale = defaultScale; rb.useGravity = true; //張り付き処理 float tweakTension = 50f; Vector3 surfaceVector = -UpNormal *tweakTension *Mathaf.deltaClampTime(Physics.gravity.magnitude); rb.drag = minDrag; if (IsAnyContact) { rb.drag = 1f; //if(upNormalContact.otherCollider && upNormalContact.otherCollider.attachedRigidbody) //{ //} //else //{ //} if (IsMassOfMin) { transform.parent = upNormalContact.otherCollider.transform; Debug.DrawLine(transform.position, transform.parent.position, Color.magenta); } ////現在ベクトルを表面に沿わせる //Vector3 v = Vector3.ProjectOnPlane(rb.velocity , UpNormal); //transform.position = upNormalContact.point + (UpNormal * col.radius); if (fitFlag) { //表面張力(自分張り付き判定用) rb.useGravity = false; rb.AddForceAtPosition(surfaceVector, contactPos); } if (ContactRBFlag) { //表面張力(親からの反発判定用) upNormalContact.otherCollider.attachedRigidbody.AddForceAtPosition(-surfaceVector, contactPos); //重みを加える upNormalContact.otherCollider.attachedRigidbody.AddForceAtPosition(Vector3.down * tweakTension * Mathaf.deltaClampTime(Physics.gravity.magnitude), contactPos); } else { } } } }
void Move_3D() { //回転 if (lookTarget == null) { Vector3 v = KeyManagerHub.main.GetStickVel(false); if (UpperFlag) { v.y = 1f; } Vector3 vv = v; v.x = vv.y; v.y = vv.x; rsVel += v; rsVel /= 1f + (Time.deltaTime * 10f); Vector3 e = Camera.main.transform.eulerAngles; e += rsVel * speed; e.x = Mathaf.NormalizeRad(e.x); if (e.x > 75f) { e.x = 75f; } if (e.x < -75f) { e.x = -75f; } Camera.main.transform.eulerAngles = e; } else { Camera.main.transform.rotation = Quaternion.Lerp(Camera.main.transform.rotation, lookTarget.rotation, Time.deltaTime * 15f); } //移動 Vector3 pos = target.position + (UpperFlag ? Vector3.up:Vector3.zero); pos -= Camera.main.transform.forward * zOfs * zoomValue; if (lookTarget != null) { pos -= Camera.main.transform.forward * 10f; } Vector3 r = Camera.main.transform.eulerAngles; r.x = Mathaf.NormalizeRad(r.x); if (r.x > 75f) { r.x = 75f; } if (r.x < -75f) { r.x = -75f; } pos += target.up * upOfs; pos += target.up * radHeight * r.x; Vector3 rbv = targetRB.velocity; float d = Vector3.Dot(rbv.normalized, Camera.main.transform.forward); if (d < 0f) { d = 0f; } d = Mathf.Abs(d - 1f) * 0.5f; AccelVector = Vector3.Lerp(AccelVector, rbv * d, Time.deltaTime); pos += AccelVector; Vector3 fVel = (pos - Camera.main.transform.position); fVel.y *= 0.5f; rb.AddForce(fVel * Mathf.Clamp(Time.deltaTime * 100f, 0f, 1f), ForceMode.VelocityChange); // Camera.main.transform.position = pos; }