unity笔记(脚本5)

复制代码
public class Bullet : MonoBehaviour
{
    //满足碰撞条件  碰撞第一帧执行
    private void OnCollisionEnter(Collision other)
    {
        //other.collider  对方的碰撞器组件引用
        Debug.Log("OnCollisionEnter:"+other.collider);
        //other.contacts[0].point 碰撞点坐标
    }

    //满足触发条件  接触第一帧执行
    private void OnTriggerEnter(Collider other)
    { //other 就是对方碰撞器组件
        Debug.Log("OnTriggerEnter:" + other);
        Destroy(other.gameObject);
        Destroy(gameObject); 
    }

    //如果移动速度过快,将导致碰撞检测失败。
    public float moveSpeed = 100;
    private void Update1()
    {
        transform.Translate(0, 0, moveSpeed * Time.deltaTime);
        Debug.Log(transform.position);
    }

    private RaycastHit hit; 
    public LayerMask layer;
    private Vector3 targetPos;
    //解决方案:
    private void Start()
    {
        if (Physics.Raycast(transform.position, transform.forward, out hit, 500, layer))
        { //检测到目标
            targetPos = hit.point;
        }
        else
        {
            //没有目标 
            //targetPos = transform.TransformPoint(0, 0, 500);
            targetPos = transform.position + transform.forward * 500;
        }
    }

    private void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime);
        if ((transform.position - targetPos).sqrMagnitude < 0.1f)
        {
            Destroy(hit.collider.gameObject);
            Destroy(gameObject); 
        }
    }
}
复制代码
复制代码
public class CharcterMoto : MonoBehaviour
{
    private void FixedUpdate()
    {
        //如果当前位置  坐标 在其他碰撞器内  则执行OnTriggerEnter方法
    }

    private void Update()
    {
        float hor = Input.GetAxis("Horizontal");
        float ver = Input.GetAxis("Vertical");
        if (hor != 0 || ver != 0)
        {
            MovementRotation(hor, ver);
        }
    }

    private void MovementRotation(float hor, float ver)
    {
        var dir = Quaternion.LookRotation(new Vector3(hor, 0, ver));
        transform.rotation = Quaternion.Lerp(transform.rotation, dir, rotateSpeed * Time.deltaTime);
        //transform.rotation = dir;
         
        //transform.Translate(0, 0, moveSpeed * Time.deltaTime);
        //transform.Translate(hor, 0, ver, Space.World);
        transform.Translate(transform.forward * Time.deltaTime * moveSpeed , Space.World);
    } 

    public float rotateSpeed = 10;

    public float moveSpeed = 10;
}
复制代码
复制代码
public class QuaternionAPI : MonoBehaviour
{
    private void Start()
    {  
        Quaternion qt = transform.rotation;
        //1. 四元数  -->  欧拉角
        Vector3 euler = qt.eulerAngles;
        //2.欧拉角 --> 四元数
        Quaternion qt02 = Quaternion.Euler(0, 90, 0);
        //3.轴 / 角 旋转
        //transform.rotation = Quaternion.AngleAxis(30, Vector3.up);
        //transform.localRotation = Quaternion.AngleAxis(30, Vector3.up);  
    }

    public Transform target;
    private void Update()
    {
        //4. 注视旋转
        //Quaternion dir = Quaternion.LookRotation(target.position - transform.position);
        //transform.rotation = dir;
        //transform.LookAt(target.position);

        //5.Lerp 差值旋转  由快到慢
        //transform.rotation = Quaternion.Lerp(transform.rotation, dir, 0.1f);

        //6.RotateTowards    匀速旋转
        //transform.rotation = Quaternion.RotateTowards(transform.rotation, dir, 0.1f);
         
        //Quaternion dir = Quaternion.Euler(0, 180, 0);
        //transform.rotation = Quaternion.Lerp(transform.rotation, dir, 0.005f);
        ////7. 四元数计算角度差
        //if (Quaternion.Angle(transform.rotation, dir) < 30)
        //    transform.rotation = dir;

        //8. 从?到?的旋转
        transform.rotation = Quaternion.FromToRotation(Vector3.right, target.position - transform.position);
      
    }
 
}
复制代码
复制代码
public class VectorAPI : MonoBehaviour
{
    private void Start1()
    {
        //因为 position 是属性,所以返回数据副本,直接修改z无效。所以编译错误。
        //transform.position.z = 1;

        //方案1:
        //复制(数据)
        Vector3 pos = transform.position;
        pos.z = 1;//如果仅仅修改位置的副本,物体位置不会发生改变
        transform.position = pos;

        //方案2: 
        transform.position = new Vector3(transform.position.x, transform.position.y, 1);


        //Vector3.Distance(位置1,位置2)        (位置1 - 位置2).模长 
        //建议  (位置1 - 位置2).模长平方  sqrMagnitude
    }

    public Transform t1;
    private Vector3 tangent;
    private Vector3 binNormal;
    private void Update()
    { 
        Vector3 norm = t1.position;
        ////计算垂直向量
        //Vector3.OrthoNormalize(ref norm, ref tangent, ref binNormal);

        //Debug.DrawLine(Vector3.zero, norm);
        //Debug.DrawLine(Vector3.zero, tangent,Color.red);
        //Debug.DrawLine(Vector3.zero, binNormal, Color.yellow);  

        //计算t1物体在地面上的投影
        Vector3 project = Vector3.ProjectOnPlane(norm, Vector3.up);
        Debug.DrawLine(Vector3.zero, norm);
        Debug.DrawLine(Vector3.zero, project,Color.red);

        //计算反射向量:Vector3.Reflect 
    }

    public Vector3 currentSpeed;
    //移动类API
    private void OnGUI()
    {
        if (GUILayout.RepeatButton("Lerp"))
        {
            //由快到慢      无限接近目标点
            //起点改变    终点、比例不变
            transform.position =
                Vector3.Lerp(transform.position, new Vector3(0, 0, 10), 0.1f);
        }

        if (GUILayout.RepeatButton("MoveTowards"))
        {
            //匀速     无限接近目标点 
            transform.position =
                Vector3.MoveTowards(transform.position, new Vector3(0, 0, 10), 0.1f);
        }

        if (GUILayout.RepeatButton("SmoothDamp"))
        {
            //平滑阻尼
            transform.position =
                Vector3.SmoothDamp(transform.position, new Vector3(0, 0, 10), ref currentSpeed, 2);
        }

        if (GUILayout.RepeatButton("变速运动"))
        {
            x += Time.deltaTime / time; 
            //由快到慢      无限接近目标点
            //起点 、终点 不变     比例改变
            Vector3 begin = Vector3.zero;
            //transform.position =
            //    Vector3.Lerp(begin, new Vector3(0, 0, 10), curve.Evaluate(x));
            transform.position =
                Vector3.LerpUnclamped(begin, new Vector3(0, 0, 10), curve.Evaluate(x));
        } 
    }

    public AnimationCurve curve;
    private float x;
    public float time =1;

    //练习:物体闪烁
    private void Start()
    {
        Material mt;
        //mt.SetFloat("_Shininess",    ?  );
    }
}
复制代码

 

posted @   xms_667  阅读(44)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示