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", ? ); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)