用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c#代码库

用于导弹之类的发射,自动寻找目标

2015-07-22 作者: 越傻越快乐举报

[c#]代码库

// 这段代码用于导弹之类的发射,自动寻找目标等等

public Vector3 Noise = new Vector3 (20, 20, 20);
public float Damping = 3;
public float TargetLockDirection = 0.5f;
public int DistanceLock = 70;
public int DurationLock = 40;

private bool locked;

private void FixedUpdate() {

	// 给物体一个速度向量(去掉重力)
	rigidbody.velocity = new Vector3(transform.forward.x * Speed * Time.fixedDeltaTime, transform.forward.y * Speed * Time.fixedDeltaTime, transform.forward.z * Speed * Time.fixedDeltaTime);
	rigidbody.velcoity += new Vector3 (Random.Range (-Noise.x, Noise.x), Random.Range (-Noise.y, Noise.y), Random.Range (-Noise.z, Noise.z));

	// 若不给予一个速度,则物体将会匀速运动
	if (Speed < SpeedMax) {
		Speed += SpeedMult * Time.fixedDeltaTime;
	}
}

// 在Update里,所要做的是1.寻找并锁定目标 2.旋转角色,使得其向着目标前进
private void Update() {

	if (Target) {
		// 获取目标与角色之间的角度差,以四元数的形式返回
		// 这里是使角色的z轴正方向对着目标
		Quaternion rotation = Quaternion.LookRation(Target.transform.position - transform.transform.position);
		// 平滑地转向目标
		transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Damping);
		// 计算目标与角色之间的余弦值,判断目标是否仍在范围内
		Vector3 dir = (Target.transform.position - transform.position).normalized;
		float direction = Vector3.Dot (dir, transform.forward);
		// 不在范围内就重置目标
		if (direction < TargetLockDirection) {
			Target = null;
		}
	}

	// 是否启动锁定器?
	if (Seeker) {
		// 延迟锁定的时间
		if (timeToLock > DurationLock) {
			// 没有锁定并且没有找到目标
			if (!locked && !Target) {
				float distance = int.MaxValue;
				// 遍历所有目标对象
				for (int t = 0; t < TargetTag.Length; t++) {
					if (GameObject.FindGameObjectsWithTag(TargetTag[t].Length > 0)) {
						GameObject[] objs = GameObject.FindGameObjectsWithTag(TargetTag[t]);

						for (int i = 0; i < objs.Length; i++) {
							if (objs[i]) {
								// 这两段代码的作用是用于计算对象与角色之间夹角的余弦值,再根据余弦值来判断对象是否在目标范围内
								// 这里应用到的数学知识是两个向量a,b的点乘相当于a,b的模相乘,再与它们之间的余弦值相乘。
								// 先求出对象与角色之间的方向向量,再单位化,则它的模就为1了
								// transform.forward相对于角色前进方向(z轴)的方向向量,它的模是1
								// 因此变量direction就是它们两个方向向量的余弦值了。
								Vector3 dir = (objs[i].transform.position - transform.position.normalized);
								float direction = Vector3.Dot(dir, transform.forward);

								// 求得两个对象之间的距离
								float dis = Vector3.Distance(objs[i].transform.position, transform.position);
								// 若果对象在目标范围之内, 记得direction是余弦值,
								if (direction >= TargetLockDirection) {
									// 若果对象在目标距离之内
									if (DistanceLock > dis) {
										// 选择距离最近的
										if (distance > dis) {
											distance = dis;
											Target = objs[i];
										}
										locked = true;
									}
								}
							}
						}
					}
				}
			}
		} else {
			timeToLock += 1;
		}

		if (Target) {

		} else {
			locked = false;
		}

	}
}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...