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", ? );
}
}