Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    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;
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    // 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);
    }
Ejemplo n.º 6
0
    /// <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));
            }
        }
    }
Ejemplo n.º 7
0
    // 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);
    }
Ejemplo n.º 8
0
    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);
        }
    }
Ejemplo n.º 9
0
    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;
            }
        }
    }
Ejemplo n.º 11
0
    // 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));
    }
Ejemplo n.º 12
0
    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;
    }
Ejemplo n.º 13
0
 public void BreakAtRay(RaycastHit hit)
 {
     Mathaf.DrawTexture_Ray(texture_A_XY, hit, defaultStamp);
 }
Ejemplo n.º 14
0
    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;
        }
    }
Ejemplo n.º 16
0
    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
                {
                }
            }
        }
    }
Ejemplo n.º 17
0
    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;
    }