【发布时间】:2020-07-31 16:38:04
【问题描述】:
这就是我的船的设置。我试图改变其中的值,但似乎没有产生任何效果:
船:
- 网格渲染器
- 刚体
- 网格碰撞器
- 浮动对象脚本
- 船控制器脚本
湖:
- 水上基本飞机
- 网格渲染器
- 水基础脚本
WaterBasic(湖)编码:
using System;
using UnityEngine;
namespace UnityStandardAssets.Water
{
[ExecuteInEditMode]
public class WaterBasic : MonoBehaviour
{
void Update()
{
Renderer r = GetComponent<Renderer>();
if (!r)
{
return;
}
Material mat = r.sharedMaterial;
if (!mat)
{
return;
}
Vector4 waveSpeed = mat.GetVector("WaveSpeed");
float waveScale = mat.GetFloat("_WaveScale");
float t = Time.time / 20.0f;
Vector4 offset4 = waveSpeed * (t * waveScale);
Vector4 offsetClamped = new Vector4(Mathf.Repeat(offset4.x, 1.0f), Mathf.Repeat(offset4.y, 1.0f),
Mathf.Repeat(offset4.z, 1.0f), Mathf.Repeat(offset4.w, 1.0f));
mat.SetVector("_WaveOffset", offsetClamped);
}
}
}
这是 FloatObjectScript (Boat) 的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class FloatObjectScript : MonoBehaviour
{
public float waterLevel = 0.0f;
public float floatThreshold = 2.0f;
public float waterDensity = 0.125f;
public float downForce = 4.0f;
private float forceFactor;
private Vector3 floatForce;
void FixedUpdate()
{
forceFactor = 1.0f - ((transform.position.y - waterLevel) / floatThreshold);
if (forceFactor > 0.0f)
{
floatForce = -Physics.gravity * GetComponent<Rigidbody>().mass * (forceFactor - GetComponent<Rigidbody>().velocity.y * waterDensity);
floatForce += new Vector3(0.0f, -downForce * GetComponent<Rigidbody>().mass, 0.0f);
GetComponent<Rigidbody>().AddForceAtPosition(floatForce, transform.position);
}
}
}
【问题讨论】:
-
您能否提供更多详细信息,说明是什么让船首先移动?它是纯粹基于物理的吗?你在使用脚本吗?它有动画吗?水有对撞机吗?船的父游戏对象上有哪些组件?
-
我从资产中导入船。船:一。刚体 ii.浮动对象脚本 iii.船控制器脚本 iv。网状对撞机水:i。水基础脚本
-
嗨,我看到您正在使用unityscript 标签,请注意,这是(如标签信息中所述)Unity 不推荐使用的脚本语言,而不是包含所有脚本的术语在统一。你的问题是关于 C# 的。如果您使用实际语言 UnityScript 处理遗留代码,请仅使用此标记。这使问题和标签保持一致:)
-
好的。谢谢你通知我。将其删除。
-
这里有两种不同的方法。 1. 冻结小船刚体旋转,使其完全不会倾倒。 2.在船脚本中不断检查船的旋转是否超过10度,如果超过,则向船添加一些扭矩(旋转力)使其向另一个方向倾斜。这也会给船一个不错的摇摆动作。编辑:第三种方法是为船设置动画。动画是相对于游戏对象的父级完成的,因此仅通过动画让子级保持直立不会对父级的运动产生任何影响。
标签: c# visual-studio unity3d