名称: 互动剧场设计师 描述: 提供创建互动剧场体验的指导,观众通过互动系统和分支叙事参与、影响或共同创作表演。 许可证: MIT
互动剧场设计师
这个技能提供创建剧场体验的指导,其中观众通过互动系统和分支叙事参与、影响或共同创作表演。
核心能力
- 分支叙事: 多路径故事结构
- 观众代理: 有意义的選擇和参与
- 沉浸式设计: 环境故事讲述,场地特定作品
- 实时系统: 实时适应和涌现
- 混合格式: 物理/数字集成
互动剧场基础
互动性频谱
被动 主动
│ │
├──传统──┬──漫步式──┬──沉浸式──┬──参与式──┤
│ 剧场 │ 剧场 │ 剧场 │ 剧场 │
│ │ │ │ │
│ 固定座位 │ 观众 │ 观众 │ 观众 │
│ 第四堵墙 │ 移动 │ 在故事世界内 │ 影响 │
│ 无代理 │ 部分代理 │ 一些代理 │ 完全代理 │
└───────────────┴─────────────┴─────────────┴─────────────────┘
参与模式
| 模式 | 描述 | 设计挑战 |
|---|---|---|
| 见证者 | 从内部观察 | 管理视线,亲密感 |
| 探索者 | 选择去哪里 | 平衡错失恐惧,奖励好奇心 |
| 玩家 | 做出故事选择 | 创建有意义的赌注 |
| 共同创作者 | 生成内容 | 搭建创意框架 |
| 表演者 | 成为角色 | 降低抑制障碍 |
分支叙事设计
结构类型
线性变体
A ──→ B ──→ C ──→ D
↓
B' (基于早期选择的变体)
分支树
┌── B1 ──→ C1
A ────┤
└── B2 ──→ C2 ──┬── D1
└── D2
折叠路径(重新收敛)
┌── B1 ──┐
A ────┤ ├──→ D
└── B2 ──┘
中心和辐条
┌── B ──┐
┌────┤ │
A ──┤ └───────┘
│ ┌── C ──┐
└────┤ │
└───────┘
平行线程
A1 ───────→ B1 ───────→ C1
↕ 同步
A2 ───────→ B2 ───────→ C2
选择架构
class NarrativeChoice:
"""故事中的一个决策点"""
def __init__(self, prompt, options):
self.prompt = prompt
self.options = options
self.context_requirements = []
self.consequences = {}
def evaluate_options(self, audience_state):
"""基于状态确定可用选择"""
available = []
for option in self.options:
if option.is_available(audience_state):
available.append(option)
# 始终确保至少两个有意义的选项
if len(available) < 2:
available.append(self._create_fallback_option())
return available
class StoryBeat:
"""叙事动作的一个单元"""
def __init__(self, content, duration_range, choice=None):
self.content = content
self.min_duration = duration_range[0]
self.max_duration = duration_range[1]
self.choice = choice # 可选的NarrativeChoice
self.state_changes = {} # 这个节拍修改的内容
self.prerequisites = [] # 达到此点必须为真的条件
后果系统
class ConsequenceTracker:
"""跟踪选择及其连锁效应"""
def __init__(self):
self.choices_made = []
self.world_state = {}
self.character_relationships = {}
self.available_endings = set()
def record_choice(self, choice_id, option_selected, timestamp):
self.choices_made.append({
'choice': choice_id,
'selected': option_selected,
'time': timestamp
})
self._apply_consequences(choice_id, option_selected)
self._update_available_endings()
def _apply_consequences(self, choice_id, option):
"""应用即时和延迟后果"""
# 即时效果
for effect in option.immediate_effects:
self._apply_effect(effect)
# 排队延迟效果
for effect in option.delayed_effects:
self._queue_effect(effect)
def get_story_fingerprint(self):
"""此观众旅程的唯一标识符"""
return hash(tuple(
(c['choice'], c['selected'])
for c in self.choices_made
))
观众代理设计
选择设计原则
使选择有意义:
- 清晰赌注:什么有风险?
- 可见后果:他们能观察到的变化
- 情感投入:他们关心的角色
- 无“正确”答案:多个有效路径
避免选择瘫痪:
- 在决策点限制到2-4个选项
- 提供足够上下文(但不过多)
- 有目的地使用时间压力
- 信号选择的重要性级别
投票和集体选择
class CollectiveDecision:
"""将观众输入聚合成故事决策"""
def __init__(self, voting_method='plurality'):
self.voting_method = voting_method
self.votes = {}
def collect_votes(self, options, timeout_seconds=30):
"""从观众收集投票"""
# 方法:举手、移动应用、物理移动、声音
pass
def resolve(self):
"""基于投票方法确定结果"""
methods = {
'plurality': self._plurality, # 最多票数获胜
'supermajority': self._supermajority, # 需要2/3
'consensus': self._consensus, # 一致同意
'weighted': self._weighted, # 某些票数权重更高
'random_delegate': self._delegate # 一个人决定
}
return methods[self.voting_method]()
def _plurality(self):
return max(self.votes.keys(), key=lambda x: self.votes[x])
个体与集体代理
| 方法 | 优点 | 缺点 |
|---|---|---|
| 个体选择 | 个人投入 | 后勤复杂性 |
| 集体投票 | 易于管理 | 少数感觉被忽视 |
| 代表制 | 两者平衡 | 选择代表 |
| 平行路径 | 每个人都获得代理 | 需要更多内容 |
沉浸式环境设计
空间作为叙事
传统舞台 沉浸式空间
┌─────────────────┐ ┌─────────────────────────────┐
│ │ │ 花园 │ 图书馆 │
│ 舞台 │ │ (过去) │ (记忆) │
│ │ │ ◇ ↔ ◇ │
├─────────────────┤ ├────────────┼───────────────┤
│ 观众 │ │ 厨房 │ 卧室 │
│ │ │ (现在) │ (未来) │
└─────────────────┘ │ ◇ ↔ ◇ │
└─────────────────────────────┘
◇ = 表演热点
↔ = 观众流动路径
环境故事讲述元素
class ImmersiveSpace:
"""设计沉浸式剧场环境"""
def __init__(self, venue):
self.venue = venue
self.zones = {}
self.artifacts = []
self.ambient_states = {}
def add_zone(self, zone):
"""定义一个叙事区域"""
self.zones[zone.name] = zone
def design_discovery_path(self, story_beats):
"""创建环境叙事弧"""
path = []
for beat in story_beats:
zone = self._select_zone_for_beat(beat)
artifacts = self._place_artifacts(beat, zone)
ambient = self._set_ambient_state(beat, zone)
path.append({
'beat': beat,
'zone': zone,
'artifacts': artifacts,
'ambient': ambient
})
return path
class NarrativeArtifact:
"""发现时讲述故事的对象"""
def __init__(self, name, backstory, discovery_trigger):
self.name = name
self.backstory = backstory # 它揭示的内容
self.discovery_trigger = discovery_trigger # 如何发现
self.required_for_story = False
self.hidden_level = 0 # 0=明显, 5=非常隐藏
感官设计
| 感官 | 故事讲述用途 | 技术考虑 |
|---|---|---|
| 视觉 | 角色、情绪、焦点 | 灯光图、布景 |
| 音频 | 氛围、过渡 | 扬声器、声学设计 |
| 嗅觉 | 记忆、地点、情感 | 气味机、自然 |
| 触觉 | 纹理、温度 | 材料选择 |
| 味觉 | 仪式、共融 | 食品安全、过敏 |
实时系统设计
实时适应
class ShowController:
"""基于观众行为管理现场表演"""
def __init__(self, script, performers, systems):
self.script = script
self.performers = performers
self.systems = systems # 灯光、声音、效果
self.current_beat = None
self.audience_state = AudienceState()
def update(self):
"""在表演期间连续调用"""
# 观察观众
self.audience_state.update(self._observe_audience())
# 检查触发器
triggers = self._check_triggers()
# 如果需要,适应
for trigger in triggers:
self._handle_trigger(trigger)
# 提示表演者
self._send_performer_cues()
def _check_triggers(self):
"""检测需要适应的条件"""
triggers = []
# 观众参与度低
if self.audience_state.engagement < 0.3:
triggers.append(('low_engagement', 'intensify'))
# 观众移动到意外区域
if self._unexpected_movement():
triggers.append(('migration', 'redirect_or_adapt'))
# 时间超出/不足
pace = self._calculate_pace()
if pace < 0.8:
triggers.append(('slow_pace', 'compress'))
elif pace > 1.2:
triggers.append(('fast_pace', 'expand'))
return triggers
表演者通信
class PerformerCueSystem:
"""与表演者的实时通信"""
def __init__(self):
self.performers = {}
self.cue_queue = []
def add_performer(self, name, device_type):
"""用他们的提示设备注册表演者"""
self.performers[name] = {
'device': device_type, # '耳麦'、'可穿戴'、'视觉'
'current_track': None,
'status': 'ready'
}
def send_cue(self, performer, cue_type, content, urgency='normal'):
"""向特定表演者发送提示"""
cue = {
'performer': performer,
'type': cue_type, # '开始'、'保持'、'重定向'、'即兴'
'content': content,
'urgency': urgency
}
self._transmit(cue)
def broadcast_state_change(self, new_state):
"""通知所有表演者故事状态变化"""
for performer in self.performers:
self.send_cue(
performer,
'state_change',
new_state,
urgency='low'
)
文档和规划
表演圣经结构
## [表演标题] 制作圣经
### 概念
- 一句话梗概(一句句子)
- 主题
- 观众体验目标
### 叙事
- 故事摘要(非分支核心)
- 分支点和选项
- 结局(及如何达到)
- 角色分解
### 空间
- 场地要求
- 区域地图
- 物品清单
- 技术要求
### 互动性
- 选择点目录
- 参与机制
- 边缘案例和恢复
### 操作
- 观众旅程图
- 表演者轨道
- 舞台管理协议
- 紧急程序
运行表格式
时间 | 节拍 | 动作 | 触发器
--------|----------------|----------------------|------------------
0:00 | 聚集 | 观众进入 | N/A
0:15 | 介绍 | 主持人欢迎 | 全部在场
0:20 | 选择 1 | 投票路径 | 2分钟计时器
0:22 | 分支 A 或 B | 分裂观众 | 投票结果
... | ... | ... | ...
1:45 | 收敛 | 所有路径会合 | 所有组到达
2:00 | 终场 | 最终选择 | 计时器
2:10 | 结束 | 全场灯光 | 掌声
最佳实践
为失败设计
- 计划空房间(无人选择该路径)
- 计划拥挤房间(所有人都选择相同路径)
- 计划困惑观众(不清楚指示)
- 计划干扰参与者(优雅管理)
- 计划技术故障(降级模式操作)
排练过程
- 纸面原型: 首先在纸上走通
- 走位排练: 测试间距和移动
- 分支排练: 分别练习每个路径
- 集成: 运行完整表演含选择
- 观众测试: 邀请观众反馈
- 技术: 添加所有技术元素
- 预演: 公开表演以精炼
参考
references/choice-architecture.md- 设计有意义的决策references/immersive-case-studies.md- 著名作品分析references/live-systems-tech.md- 技术实现模式